2017.9.25 社交网络 思考记录

来源:互联网 发布:linux vsftpd配置详解 编辑:程序博客网 时间:2024/06/05 07:11

这个题一开始可能有点懵逼,但手玩一会就会好很多

首先这些小问题都是可以独立解决的

1:求多源最短路  —— floyd

2:怎么求每个v? ——枚举v,在枚举i、j。。而且还可以通过f判断在不在最短路上

3:求两点间路径总数 ——  相等直接在floyd上加新的组合、不相等直接覆盖

要证明这么做的正确性,可以用floyd的正确性

反证法:

因为路径条数和最短路同时更新,所以如果这么做会有遗漏,则说明两点之间的距离floyd没有更新到,    说明最短路是错的,,   不成立

所以是正确的、、(不是很清楚原理就只能用正确性证了、、

码:

#include<iostream>#include<cstdio>using namespace std;double f[202][202],cnt[202][202],ans[202];int a,b,c,n,m,i,j,k;int main(){for(i=0;i<=200;i++)for(j=0;j<=200;j++)f[i][j]=10000000009;scanf("%d%d",&n,&m);for(i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);f[a][b]=f[b][a]=c;cnt[a][b]=cnt[b][a]=1;}for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(i==j||j==k||i==k)continue;if(f[i][k]+f[k][j]==f[i][j])cnt[i][j]+=cnt[i][k]*cnt[k][j];if(f[i][k]+f[k][j]<f[i][j]){f[i][j]=f[i][k]+f[k][j];cnt[i][j]=cnt[i][k]*cnt[k][j];}} for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(i==j||i==k||j==k)continue;if(f[i][k]+f[k][j]==f[i][j]){ans[k]+=cnt[i][k]/cnt[i][j]*cnt[k][j];}}for(i=1;i<=n;i++)printf("%.3lf\n",ans[i]);}