1、最短路上的统计
题目:一个无向图,没有自环,所有边的权值均为1,对于一个点对(a,b),输出a,b之间所有最短路上的点的总个数。
题解:floyed求出所有的最短路,
如果 map[a,b]=map[a,k]+map[k,b] 那么 k 就是 a b 最短路上的点。最后输出总个数+2。
编译通过...├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
-------------------------
Accepted 有效得分:100 有效耗时:0ms
1 #include <stdio.h>
2 #define N 101
3 int main()
4 {
5 int map[N][N];
6 int i,j,k,n,m,t,s,a,b;
7 scanf("%d%d",&n,&m);
8 for(i=1;i<=n;i++)
9 for(j=1;j<=n;j++)
10 map[i][j]=999999;
11 for(i=0;i<m;i++)
12 {
13 scanf("%d%d",&a,&b);
14 map[a][b]=1;
15 map[b][a]=1;
16 }
17 for(k=1;k<=n;k++)
18 for(i=1;i<=n;i++)
19 for(j=1;j<=n;j++)
20 if(map[i][k]+map[k][j]<map[i][j])
21 map[i][j]=map[i][k]+map[k][j];
22 scanf("%d",&t);
23 while(t--)
24 {
25 s=0;
26 scanf("%d%d",&a,&b);
27 for(i=1;i<=n;i++)
28 if(map[a][i]+map[i][b]==map[a][b]&&i!=a&&i!=b)
29 s++;
30 printf("%d\n",s+2);
31 }
32 return 0;
33
2 #define N 101
3 int main()
4 {
5 int map[N][N];
6 int i,j,k,n,m,t,s,a,b;
7 scanf("%d%d",&n,&m);
8 for(i=1;i<=n;i++)
9 for(j=1;j<=n;j++)
10 map[i][j]=999999;
11 for(i=0;i<m;i++)
12 {
13 scanf("%d%d",&a,&b);
14 map[a][b]=1;
15 map[b][a]=1;
16 }
17 for(k=1;k<=n;k++)
18 for(i=1;i<=n;i++)
19 for(j=1;j<=n;j++)
20 if(map[i][k]+map[k][j]<map[i][j])
21 map[i][j]=map[i][k]+map[k][j];
22 scanf("%d",&t);
23 while(t--)
24 {
25 s=0;
26 scanf("%d%d",&a,&b);
27 for(i=1;i<=n;i++)
28 if(map[a][i]+map[i][b]==map[a][b]&&i!=a&&i!=b)
29 s++;
30 printf("%d\n",s+2);
31 }
32 return 0;
33