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

821 - Page Hopping (Floyd)

时间:2015-08-18 12:13:20      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:floyd   acm-icpc   acm   uva   

很裸的Floyd水题,只需要注意一点: 题目中给的结点编号并不是完整的从1~n,不过没有关系,因为我们初始化为INF,当两点间距离不等于INF时相加就可以了。

细节参见代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn =  105;
const int INF = 1000000;
int a,b,n,d[maxn][maxn],kase = 0;
void Floyd() {
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            d[i][j] = min(d[i][j],d[i][k]+d[k][j]);
}
map<int,int> p;
int main() {
    while(~scanf("%d%d",&a,&b)) {
        if( !a && !b ) return 0;
        for(int i=1;i<=maxn-1;i++)
            for(int j=1;j<=maxn-1;j++) d[i][j] = (i == j ? 0 : INF);
        n = 0; p.clear(); int cnt = 0;
        d[a][b] = 1;
        while(true) {
            scanf("%d%d",&a,&b);
            if( !a && !b ) break;
            if(!p.count(a)) p[a] = 1 , cnt++;
            if(!p.count(b)) p[b] = 1 , cnt++;
            n = max(n,max(a,b));
            d[a][b] = 1;
        }
        Floyd();
        int ans = 0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            if(d[i][j] < INF) ans += d[i][j];
        printf("Case %d: average length between pages = %.3f clicks\n",++kase,ans*1.0/(cnt*(cnt-1)));
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

821 - Page Hopping (Floyd)

标签:floyd   acm-icpc   acm   uva   

原文地址:http://blog.csdn.net/weizhuwyzc000/article/details/47747311

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