码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ1491 NOI2007 社交网络 最短路

时间:2017-02-28 00:29:54      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:zoj   one   limit   cli   bsp   code   names   ima   str   

题意:求每个节点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;
}
View Code

 

BZOJ1491 NOI2007 社交网络 最短路

标签:zoj   one   limit   cli   bsp   code   names   ima   str   

原文地址:http://www.cnblogs.com/WDZRMPCBIT/p/6476824.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!