天天看点

821 - Page Hopping (Floyd)

很裸的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;
}