UVA - 821 - Page Hopping(floyd算法)
题意:用标号给定几个网站,一个标号(1~100)代表一个网站(标号的给定无连续性)。可以通过一个网站访问另一个网站(通过给定的有向图路径),题目保证任意两个网站都有路到达且输入无自环,求每两个网站访问,最少需要经过几个网站的个数平均值。
先重整标号使其有序,再用floyd算法求出每两个的最短路,最后统计即可。
1 #include<cstdio> 2 #include<cstring> 3 #include<cctype> 4 #include<cstdlib> 5 #include<cmath> 6 #include<iostream> 7 #include<sstream> 8 #include<iterator> 9 #include<algorithm> 10 #include<string> 11 #include<vector> 12 #include<set> 13 #include<map> 14 #include<deque> 15 #include<queue> 16 #include<stack> 17 #include<list> 18 typedef long long ll; 19 typedef unsigned long long llu; 20 const int MAXN = 100 + 10; 21 const int MAXT = 10000 + 10; 22 const int INF = 0x7f7f7f7f; 23 const double pi = acos(-1.0); 24 const double EPS = 1e-6; 25 using namespace std; 26 27 int lur; 28 double g[MAXN][MAXN]; 29 map<int, int> mp; 30 31 int getid(int x){ 32 if(mp.count(x)) return mp[x]; 33 return mp[x] = ++lur; 34 } 35 36 void floyd(){ 37 for(int k = 1; k <= lur; ++k) 38 for(int i = 1; i <= lur; ++i) 39 for(int j = 1; j <= lur; ++j) 40 g[i][j] = min(g[i][j], g[i][k] + g[k][j]); 41 } 42 43 void merge(int a, int b){ 44 int x = getid(a), y = getid(b); 45 g[x][y] = 1; 46 } 47 48 double solve(){ 49 floyd(); 50 double sum = 0, num = 0; 51 for(int i = 1; i <= lur; ++i) 52 for(int j = 1; j <= lur; ++j){ 53 if(i == j) continue; 54 num += 1, sum += g[i][j]; 55 } 56 return sum / num; 57 } 58 59 int main(){ 60 int a, b, cas = 0; 61 while(scanf("%d%d", &a, &b) == 2 && (a || b)){ 62 for(int i = 0; i < MAXN; ++i) for(int j = 0; j < MAXN; ++j) g[i][j] = 1e9; 63 mp.clear(); 64 lur = 0; 65 merge(a, b); 66 while(scanf("%d%d", &a, &b) == 2 && (a || b)) merge(a, b); 67 printf("Case %d: average length between pages = %.3lf clicks\n", ++cas, solve()); 68 } 69 return 0; 70 }

浙公网安备 33010602011771号