1. 程式人生 > >洛谷 P1339 [USACO09OCT]熱浪Heat Wave

洛谷 P1339 [USACO09OCT]熱浪Heat Wave

ems pty use hat 輸出 mat dev ons 天下

題目鏈接:https://www.luogu.org/problem/show?pid=1339

題目描述

德克薩斯純樸的民眾們這個夏天正在遭受巨大的熱浪!!!他們的德克薩斯長角牛吃起來不錯,可是他們並不是很擅長生產富含奶油的乳製品。Farmer John此時以先天下之憂而憂,後天下之樂而樂的精神,身先士卒地承擔起向德克薩斯運送大量的營養冰涼的牛奶的重任,以減輕德克薩斯人忍受酷暑的痛苦。

FJ已經研究過可以把牛奶從威斯康星運送到德克薩斯州的路線。這些路線包括起始點和終點先一共經過T (1 <= T <= 2,500)個城鎮,方便地標號為1到T。除了起點和終點外地每個城鎮由兩條雙向道路連向至少兩個其它地城鎮。每條道路有一個通過費用(包括油費,過路費等等)。

給定一個地圖,包含C (1 <= C <= 6,200)條直接連接2個城鎮的道路。每條道路由道路的起點Rs,終點Re (1 <= Rs <= T; 1 <= Re <= T),和花費(1 <= Ci <= 1,000)組成。求從起始的城鎮Ts (1 <= Ts <= T)到終點的城鎮Te(1 <= Te <= T)最小的總費用。

輸入輸出格式

輸入格式:

第一行: 4個由空格隔開的整數: T, C, Ts, Te

第2到第C+1行: 第i+1行描述第i條道路。有3個由空格隔開的整數: Rs, Re和Ci

輸出格式:

一個單獨的整數表示從Ts到Te的最小總費用。數據保證至少存在一條道路。

輸入輸出樣例

輸入樣例#1:
7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1
輸出樣例#1:
7

說明

【樣例說明】

5->6->1->4 (3 + 1 + 3)

吐槽:天熱了吃雪糕不好麽qwq非要喝冰涼涼牛奶

誰說雪糕不能用牛奶做了……

FJ:What‘s up???

分析:

最短路模板。這裏選擇SPFA(因為寫得最順)。

個人感覺圖論很多知識是不需要理解透徹了再去寫代碼的。把代碼多抄兩遍,慢慢就會懂得原理。

上代碼:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<queue> 
 7 
 8 using namespace std;
 9 const int MAXN = 10000 + 5;
10 
11 int f,t,v,s,e,n,m;
12 int tot;
13 int first[MAXN],nxt[MAXN << 1],dis[MAXN];
14 bool use[MAXN];
15 
16 struct edge
17 {
18     int f,t,v;
19 }l[MAXN << 1];
20 
21 void init()
22 {
23     memset(first,-1,sizeof(first));
24     tot = 0;
25 } 
26 
27 void build(int f,int t,int v)
28 {
29     l[++ tot] = (edge){f,t,v};
30     nxt[tot] = first[f];
31     first[f] = tot;
32 } 
33 
34 queue <int> q; 
35 
36 void spfa(int s)
37 {
38     memset(dis,0x3f,sizeof(dis));
39     while(!q.empty())
40         q.pop();
41     q.push(s);
42     use[s] = 1;
43     dis[s] = 0;
44     
45     while(!q.empty())
46     {
47         int u = q.front();
48         q.pop();
49         use[u] = 0;
50         
51         for(int i = first[u];i != -1;i = nxt[i])
52         {
53             int v = l[i].t;
54             if(dis[v] > dis[u] + l[i].v)
55             {
56                 dis[v] = dis[u] + l[i].v;
57                 if(!use[v])
58                 {
59                     use[v] = 1;
60                     q.push(v);
61                 }
62             }
63         }
64     }
65 }
66 int main()
67 {
68     scanf("%d%d%d%d",&n,&m,&s,&e);
69     init();
70     for(int i = 1;i <= m;i ++)
71     {
72         scanf("%d%d%d",&f,&t,&v);
73         build(f,t,v);
74         build(t,f,v);
75     }
76     spfa(s);
77     printf("%d",dis[e]);
78     return 0;
79 }

註意:

1.由於是無向圖,所以建圖時要build兩次。

2.洛谷評測機使用Linux系統,time、next都是Linux的關鍵字,變量名要格外註意。當然如果你用CodeVS等使用Windows系統評測機的OJ就不用擔心這個問題。

洛谷 P1339 [USACO09OCT]熱浪Heat Wave