BZOJ1491|社交网络|Floyd
Description
Input
Output
输出文件包括n 行,每行一个实数,精确到小数点后3 位。第i 行的实数表 示结点i 在社交网络中的重要程度。
Sample Input
4 4
1 2 1
2 3 1
3 4 1
4 1 1
Sample Output
1.000
1.000
1.000
1.000
HINT
为1
分析:一看范围就笑了,Floyd不解释。
#include<iostream> #include<cstdio> #include<cstdlib> using namespace std; double map[101][101]; double a[101][101]; double ans[101]; int main() { int n,m; cin >> n >> m; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) map[i][j]=1e15; for (int i=1; i<=m; i++) { int x,y; double z; scanf("%d%d%lf",&x,&y,&z); map[x][y]=map[y][x]=z; a[x][y]=a[y][x]=1; } for (int k=1; k<=n; k++) for(int i=1; i<=n; i++) for (int j=1; j<=n; j++) { if (map[i][k]+map[k][j]<map[i][j]) { map[i][j]=map[i][k]+map[k][j]; a[i][j]=0; } if (map[i][k]+map[k][j]==map[i][j]) a[i][j]+=a[i][k]*a[k][j]; } for (int i=1; i<=n; i++) a[i][i]=0; for (int k=1; k<=n; k++) for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) if (map[i][k]+map[k][j]==map[i][j] && a[i][j]>0) ans[k]+=a[i][k]*a[k][j]/a[i][j]; for (int i=1; i<=n; i++) printf("%.3lf\n",ans[i]); system("pause"); return 0; }