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

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-01-10
  • 2021-11-02
  • 2021-09-25
猜你喜欢
  • 2022-12-23
  • 2021-11-11
  • 2021-08-12
  • 2022-12-23
  • 2021-09-18
  • 2021-07-21
  • 2022-12-23
相关资源
相似解决方案