「fjWC2014」最短路
Description
给定一个n个点m个边的有向图,所有边长度为1,现问对于每条边,设这条边从节点x出发指向节点y,将这条边从图中删除之后,x到y的最短路为多少
Input
首先输入一个整数Q(0 < Q ≤ 10),表示有Q组样例
每组样例首先输入两个整数n, m (0 < n ≤ 500, 0 < m ≤ 10000),表示该组样例所表示的图中有n个点和m条有向边,之后m行,每行两个个整数x, y, (1 ≤ x, y ≤ n),表示有一条编号为x的节点出发指向编号为y的节点的边,输入保证对于任意对整数对(x, y),最多存在一条从x指向y的边,但可能同时存在从x指向y的边和y指向x的边
Output
对于每组样例,首先输出样例编号,之后输出m个数,以此表示删除这条边后,这条边原来连接的两个节点之间的最短路,如果删除这条边之后两个点之间不存在路径相连,输出0,具体格式见sample output
Sample Input
3
3 3
1 2
2 3
1 3
3 3
1 2
2 1
1 3
3 6
1 2
2 1
1 3
3 1
3 2
2 3
Sample Output
Case 1: 0 0 2
Case 2: 0 0 0
Case 3: 2 2 2 2 2 2
此题广搜竟然可以AC。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int T,n,m; struct data1{int from,to,next;}e[10001]; int head[501],mark[10001],q[10001]; void bfs(int k) { int t=0,w=1,i,now; int x=e[k].from,y=e[k].to; q[t]=x; while(t<w) { now=q[t];t++; i=head[now]; while(i) { if(!mark[e[i].to]&&i!=k) { q[w++]=e[i].to; mark[e[i].to]=mark[now]+1; if(e[i].to==y){printf("%d ",mark[y]);return;} } i=e[i].next; } } printf("0 "); } int main() { scanf("%d",&T); for(int l=1;l<=T;l++) { memset(head,0,sizeof(head)); printf("Case %d: ",l); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); e[i].to=v; e[i].from=u; e[i].next=head[u]; head[u]=i; } for(int i=1;i<=m;i++){memset(mark,0,sizeof(mark));bfs(i);} printf("\n"); } return 0; } |
Subscribe