codevs 1664 清涼冷水

自為風月馬前卒發表於2017-04-19

1664 清涼冷水

 

時間限制: 1 s
空間限制: 128000 KB
題目等級 : 黃金 Gold
 
 
 
 
題目描述 Description

     悶熱的夏天,威斯康辛州的奶製品地區提供冷水供奶牛飲用,以此來解渴。農夫約翰將冷水通過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。

輸入描述 Input Description

    * 第 1 行: 2個用空格隔開的整數 N , C

    * 第 2 至 C+1 行: 3個用空格隔開的整數,分別表示聯結器的編號,以及連線的2個管道的編號E_i, B1_i, B2_i

輸出描述 Output Description

     * 共 N 行: 分別表示每個管道到牛棚的最短距離。

樣例輸入 Sample Input

    5 2

    3 5 4

    1 2 3

樣例輸出 Sample Output

    1

    2

    2

    3

    3

資料範圍及提示 Data Size & Hint

    +------+

    | 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 }

 

相關文章