首页 > 代码库 > BZOJ1491 NOI2007 社交网络 最短路
BZOJ1491 NOI2007 社交网络 最短路
题意:求每个节点v的$\sum\limits_{s \ne v,t \ne v} {\frac{{{C_{s,t}}(v)}}{{{C_{s,t}}}}}$,其中${C_{s,t}}(v)$为从s到t经过v的最短路的数量,${C_{s,t}}$为s到t的最短路的总数
题解:跑一边Floyd然后枚举判断即可
#include <cstdio>#include <climits>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;const int MAXN=100+2;int N,M,c[MAXN][MAXN];double cnt[MAXN][MAXN],ans[MAXN];int main(){ cin >> N >> M; for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) c[i][j]=INT_MAX; for(int i=1,u,v,w;i<=M;i++){ cin >> u >> v >> w; c[u][v]=c[v][u]=w,cnt[u][v]=cnt[v][u]=1; } for(int k=1;k<=N;k++) for(int i=1;i<=N;i++) for(int j=1;j<=N;j++){ if(i==j || i==k || j==k) continue; if(c[i][k]==INT_MAX || c[k][j]==INT_MAX) continue; if(c[i][j]>c[i][k]+c[k][j]) c[i][j]=c[i][k]+c[k][j],cnt[i][j]=cnt[i][k]*cnt[k][j]; else if(c[i][j]==c[i][k]+c[k][j]) cnt[i][j]+=cnt[i][k]*cnt[k][j]; } for(int k=1;k<=N;k++) for(int i=1;i<=N;i++) for(int j=1;j<=N;j++){ if(i==j || i==k || j==k) continue; if(c[i][j]==c[i][k]+c[k][j]) ans[k]+=(cnt[i][k]*cnt[k][j])/cnt[i][j]; } for(int i=1;i<=N;i++) printf("%.3lf\n",ans[i]); return 0;}
BZOJ1491 NOI2007 社交网络 最短路
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。