题目:Page Hopping
题意:给定一个有向图,每条边的长度都是1。求出每个点到其他点的最短路径长度,然后加起来求平均数。
点不超过100个,直接上弗洛伊德算法。
就是输入恶心了一点点。输入都是成对输入,代表一条有向边。遇到两个0表示当组数据结束。一组输入如果只是两个0就代表输入结束。
并且点的编号不是1~N。所以还要稍微做点映射。
但总的来说还是很容易的。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 110;
const int inf = 1000000000;
int dp[N][N];
int mp[N];
int a, b, n;
int cal(int x){
if(~mp[x]) return mp[x];
mp[x] = ++n;
for(int i=1; i<n; i++) dp[i][n] = dp[n][i] = inf;
dp[n][n] = 0;
return n;
}
int main(){
int ct=0;
while(~scanf("%d %d", &a, &b) && (a||b)){
memset(mp, -1, sizeof(mp));
n = 0;
a = cal(a);
b = cal(b);
dp[a][b] = 1;
while(~scanf("%d %d", &a, &b) && (a||b)){
a = cal(a);
b = cal(b);
dp[a][b] = 1;
}
for(int k=1; k<=n; k++){
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
dp[i][j] = min(dp[i][j], dp[i][k]+dp[k][j]);
}
}
}
int sum = 0;
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++) if(i!=j) sum += dp[i][j];
}
printf("Case %d: average length between pages = %.3f clicks\n", ++ct, sum*1.0/(n*(n-1)));
}
return 0;
}