题意:
求所有点直接的平均最短距离
思路:
对每个点编号,然后Floyd,统计
// Floyd算法
#include <cstdio>
#include <map>
#include <cmath>
#include <cstring>
#include <algorithm>
#define fi first
#define se second
#define pii pair<int,int>
using namespace std;
const int INF = 10000000;
typedef long long LL;
const int maxn = 100+5;
const double eps = 1e-8;
int n;
int G[maxn][maxn], dis[maxn][maxn];
map<int, int> mp;
int Id(int x){
int m = mp.size();
if(mp.count(x) == 0) mp.insert(make_pair(x, m));
return mp[x];
}
void Floyd(){
for(int k = 0; k < n; ++k){
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j)if(dis[i][k] < INF&&dis[k][j] < INF){
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
}
}
}
}
int main()
{
freopen("in.txt","r",stdin);
int x1,y1;
int kase = 1;
while(scanf("%d%d",&x1,&y1) == 2){
if(x1+y1 == 0) break;
mp.clear();
for(int i = 0; i < maxn; ++i) {
dis[i][i] = 0;
for(int j = 0; j < maxn; ++j){
dis[i][j] = INF; G[i][j] = 0;
}
}
int a = Id(x1), b = Id(y1);
G[a][b] = 1; dis[a][b] = 1;
while(scanf("%d%d",&x1,&y1) == 2){
if(x1+y1 == 0) break;
a = Id(x1); b = Id(y1);
//printf("%d -> %d, ",a,b);
G[a][b] = 1; dis[a][b] = 1;
}
double sum = 0;
n = mp.size();
int cnt = n*(n-1);
Floyd();
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j) if(i != j){
//printf("%d -> %d: %d\n", i+1, j+1, dis[i][j]);
sum += dis[i][j];
}
}
printf("Case %d: average length between pages = %.3lf clicks\n", kase++, sum/cnt);
}
return 0;
}