很裸的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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-29 19:05:37