uva821网页跳跃

题意:

求所有点直接的平均最短距离

思路:

对每个点编号,然后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;
}


猜你喜欢

转载自blog.csdn.net/CY05627/article/details/91126637
今日推荐