闷热的夏天,威斯康辛州的奶制品地区提供冷水供奶牛饮用,以此来解渴。农夫约翰将冷水通过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 点此展开
#include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; #define inf 0x3f3f3f3f #define mn 100009 struct Edge { int x,y,z,nxt; Edge(int x=0,int y=0,int z=0,int nxt=0): x(x),y(y),z(z),nxt(nxt){} }edge[mn*2]; int head[mn],sumedge,dis[mn],inq[mn]; int n,m,u,v1,v2,c; void add(int x,int y,int z) { edge[++sumedge]=Edge(x,y,z,head[x]); head[x]=sumedge; } void spfa() { queue <int>q; memset(dis,0x3f,sizeof(dis)); dis[0]=0;inq[0]=1;q.push(0); while(!q.empty()) { int now=q.front();q.pop(); inq[now]=0; for(int i=head[now];i;i=edge[i].nxt) { int to=edge[i].y; if(dis[to]>dis[now]+edge[i].z) { dis[to]=dis[now]+edge[i].z; if(!inq[to]) { inq[to]=1; q.push(to); } } } } } int main() { scanf("%d %d",&n,&c); for(int i=1;i<=c;i++) { scanf("%d%d%d",&u,&v1,&v2); add(u,v1,1);add(u,v2,1); add(v1,u,1);add(v2,u,1); } add(1,0,1);add(0,1,1); spfa(); for(int i=1;i<=n;i++) printf("%d\n",dis[i]); return 0; }