noi 2007 社交网络 最短路

题意:

大水题一道

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 using namespace std;
 6 #define MAXN 101
 7 int map[MAXN][MAXN];
 8 long long path[MAXN][MAXN];
 9 int c[MAXN][MAXN][MAXN];
10 double ans[MAXN];
11 int n,m;
12 void solve()
13 {
14     memset(ans,0,sizeof(ans));
15     int i,j,k;
16     for(k=1;k<=n;k++)
17         for(i=1;i<=n;i++)
18             for(j=1;j<=n;j++)
19                 if(i!=j&&j!=k&&k!=i)
20                 {
21                     if(map[i][k]+map[k][j]==map[i][j])
22                         ans[k]+=(double)path[i][k]*path[k][j]/path[i][j];
23                 }
24     for(i=1;i<=n;i++)
25         printf("%.3lf\n",ans[i]);
26 }
27  
28 void floyd()
29 {
30     int i,j,k;
31     for(k=1;k<=n;k++)
32         for(i=1;i<=n;i++)
33             for(j=1;j<=n;j++)
34                 if(i!=j&&j!=k&&i!=k)
35                 {
36                     if(map[i][k]+map[k][j]<map[i][j])
37                     {
38                         map[i][j]=map[i][k]+map[k][j];
39                         path[i][j]=path[i][k]*path[k][j];
40                     }
41                     else if(map[i][k]+map[k][j]==map[i][j])
42                         path[i][j]+=path[i][k]*path[k][j];
43                 }
44 }
45 int main()
46 {
47     memset(path,0,sizeof(path));
48     memset(map,0x3f,sizeof(map));
49     int x,y,z;
50     scanf("%d%d",&n,&m);
51     int i;
52     for(i=1;i<=m;i++)
53     {
54         scanf("%d%d%d",&x,&y,&z);
55         map[x][y]=map[y][x]=z;
56         path[x][y]=path[y][x]=1;
57     }
58     floyd();
59     solve();
60     return 0;
61 }
原文地址:https://www.cnblogs.com/myoi/p/2595455.html