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 }