1664 清涼冷水
悶熱的夏天,威斯康辛州的奶製品地區提供冷水供奶牛飲用,以此來解渴。農夫約翰將冷水通過N (3 <= N <= 99999; N 為奇數)個冷水管道,分別編號序號1..N從泵的位置一直送到牛棚裡。當水在管道中流動時,夏天的熱能使它變熱。貝茜想要找到最冷的水,這樣她就能比任何其他奶牛更好地享受這難得的好天氣。
她已經繪製了一整套完整的分支管道,並注意到這個管道系統猶如一棵樹,它的根在農場,從根開始每個分支都分離出兩個管道。令人驚訝的是,所有管道都有一個長度,當然這所有的N根管道連線成1條路或者和其他的管道路線連線。
給出所有管道連線的地圖,計算每一個分支點到牛棚的距離。貝茜將通過這些資訊來找到最清涼冷水。
管道的端點,可以作為分支點也可以作為管道終點,它以管道的編號命名。地圖上包含C (1<= C <= N)個分支器,每個分支器包含3個資料,管道端點E_i (1<= E_i <= N),管道端點連線的兩個管道B1_i, B2_i (2<= B1_i <=N; 2<= B2_i <=N)。管道1連線到牛棚,每兩個聯結器之間的管道長度均為1。
* 第 1 行: 2個用空格隔開的整數 N , C
* 第 2 至 C+1 行: 3個用空格隔開的整數,分別表示聯結器的編號,以及連線的2個管道的編號E_i, B1_i, B2_i
* 共 N 行: 分別表示每個管道到牛棚的最短距離。
5 2
3 5 4
1 2 3
1
2
2
3
3
+------+
| Barn |
+------+
| 1
*
2 / \ 3
*
4 / \ 5
分類標籤 Tags 點此展開
基本上是裸SPFA但是需要加一下資料處理
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 const int MAXN=100001; 7 const int maxn=0x7fffffff; 8 struct node 9 { 10 int u; 11 int v; 12 int w; 13 int next; 14 }edge[MAXN]; 15 int num=1; 16 int head[MAXN]; 17 int dis[MAXN]; 18 int vis[MAXN]; 19 void spfa() 20 { 21 dis[1]=0; 22 vis[1]=0; 23 queue<int>q; 24 q.push(1); 25 while(q.size()!=0) 26 { 27 int p=q.front(); 28 q.pop(); 29 for(int i=head[p];i!=-1;i=edge[i].next) 30 { 31 int to=edge[i].v; 32 if(dis[to]>dis[p]+edge[i].w) 33 { 34 dis[to]=dis[p]+edge[i].w; 35 if(vis[to]==0) 36 { 37 vis[to]=1; 38 q.push(to); 39 } 40 } 41 } 42 } 43 } 44 int main() 45 { 46 int n,m; 47 scanf("%d%d",&n,&m); 48 for(int i=1;i<=n;i++) 49 { 50 head[i]=-1; 51 dis[i]=maxn; 52 } 53 for(int i=1;i<=m;i++) 54 { 55 int x,y,z; 56 scanf("%d%d%d",&x,&y,&z); 57 edge[num].u=x; 58 edge[num].v=y; 59 edge[num].w=1; 60 edge[num].next=head[x]; 61 head[x]=num++; 62 edge[num].u=x; 63 edge[num].v=z; 64 edge[num].w=1; 65 edge[num].next=head[x]; 66 head[x]=num++; 67 } 68 spfa(); 69 for(int i=1;i<=n;i++) 70 { 71 printf("%d\n",dis[i]+1); 72 } 73 return 0; 74 }