UVA - 821 - Page Hopping(floyd算法)

来源:互联网 发布:ntfs for mac 10.11.6 编辑:程序博客网 时间:2024/06/05 11:42


题意:用标号给定几个网站,一个标号(1~100)代表一个网站(标号的给定无连续性)。可以通过一个网站访问另一            个网站(通过给定的有向图路径),题目保证任意两个网站都有路到达且输入无自环,求每两个网站访问,最少            需要经过几个网站的个数平均值。


           先重整标号使其有序,再用floyd算法求出每两个的最短路,最后统计即可。


#include<cstdio>#include<cstring>#include<cctype>#include<cstdlib>#include<cmath>#include<iostream>#include<sstream>#include<iterator>#include<algorithm>#include<string>#include<vector>#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<list>typedef long long ll;typedef unsigned long long llu;const int MAXN = 100 + 10;const int MAXT = 10000 + 10;const int INF = 0x7f7f7f7f;const double pi = acos(-1.0);const double EPS = 1e-6;using namespace std;int lur;double g[MAXN][MAXN];map<int, int> mp;int getid(int x){    if(mp.count(x))  return mp[x];    return mp[x] = ++lur;}void floyd(){    for(int k = 1; k <= lur; ++k)        for(int i = 1; i <= lur; ++i)            for(int j = 1; j <= lur; ++j)                g[i][j] = min(g[i][j], g[i][k] + g[k][j]);}void merge(int a, int b){    int x = getid(a), y = getid(b);    g[x][y] = 1;}double solve(){    floyd();    double sum = 0, num = 0;    for(int i = 1; i <= lur; ++i)        for(int j = 1; j <= lur; ++j){            if(i == j)  continue;            num += 1, sum += g[i][j];        }    return sum / num;}int main(){    int a, b, cas = 0;    while(scanf("%d%d", &a, &b) == 2 && (a || b)){        for(int i = 0; i < MAXN; ++i)  for(int j = 0; j < MAXN; ++j)  g[i][j] = 1e9;        mp.clear();        lur = 0;        merge(a, b);        while(scanf("%d%d", &a, &b) == 2 && (a || b))  merge(a, b);        printf("Case %d: average length between pages = %.3lf clicks\n", ++cas, solve());    }    return 0;}


0 0
原创粉丝点击