1664 清凉冷水

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

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 using namespace std;
 6 queue<int>que;
 7 int far[100009];
 8 int num=1;
 9 struct node{
10     int u,v,next,w;
11 }edge[100001];
12 int head[100000],vis[100001],dis[100001];
13 int headd=0,tail=1;
14 
15 /*struct que
16 {
17     int sz[10001];
18     int front()
19     {
20         return sz[headd];
21     } 
22     void push(int x)
23     {
24         sz[++tail]=x;
25     }
26     void pop()
27     {
28         headd++;
29     }
30      int size()
31     {
32        return tail-headd;
33     }
34     void cl()
35     {
36         headd=0;
37         tail=1;
38     }
39 }queue;*/
40 void add_edge(int x,int y)
41 {
42     edge[num].u=x;
43     edge[num].v=y;
44     edge[num].w=1;
45     edge[num].next=head[x];
46     head[x]=num++;
47 }
48 void spfa()
49 {
50     que.push(1);
51     vis[1]=1;
52     dis[1]=0;
53     int now;
54     while(que.size()!=0)
55     {
56         now=que.front();
57         que.pop();
58         for(int i=head[now];i!=-1;i=edge[i].next)
59         {
60             int p=edge[i].v;
61             if(dis[p]>dis[now]+1)
62             {
63                 dis[p]=dis[now]+1;
64             }
65             if(vis[p]==0)
66             {
67                 vis[p]=1;
68                 que.push(p);
69             }
70         }
71         
72     }
73 }
74 int main()
75 {
76     int n,m,a,b,c;
77     memset(dis,0x7f,sizeof(dis));
78     scanf("%d%d",&n,&m);
79     for(int i=1;i<=n;i++)head[i]=-1;
80     for(int i=1;i<=m;i++)
81     {
82         scanf("%d%d%d",&a,&b,&c);
83         add_edge(a,b);
84         add_edge(a,c);
85     }
86     spfa();
87     for(int i=1;i<=n;i++)
88     cout<<dis[i]+1<<endl;
89 }

 

posted @ 2017-04-19 18:42  zzzzx  阅读(322)  评论(0编辑  收藏  举报