UVA Page Hopping(Floyd算法)

来源:互联网 发布:统计学数据分析方法 编辑:程序博客网 时间:2024/06/05 02:56

题意:

给出若干个点, 求出每对点之间距离的最小平均值。

解题思路:

直接Floyd求出所有点两两之间最短路径累和即可。


https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=762

Memory: 0 KB Time: 26 MSLanguage: C++ 4.8.2 Result: Accepted

#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<cctype>#include<list>#include<iostream>#include<map>#include<queue>#include<set>#include<stack>#include<vector>using namespace std;#define FOR(i, s, t) for(int i = (s) ; i <= (t) ; ++i)#define REP(i, n) for(int i = 0 ; i < (n) ; ++i)int buf[10];inline long long read(){    long long x=0,f=1;    char ch=getchar();    while(ch<'0'||ch>'9')    {        if(ch=='-')f=-1;        ch=getchar();    }    while(ch>='0'&&ch<='9')    {        x=x*10+ch-'0';        ch=getchar();    }    return x*f;}inline void writenum(int i){    int p = 0;    if(i == 0) p++;    else while(i)        {            buf[p++] = i % 10;            i /= 10;        }    for(int j = p - 1 ; j >= 0 ; --j) putchar('0' + buf[j]);}/**************************************************************/#define MAX_N 110const int INF = 0x3f3f3f3f;int G[MAX_N][MAX_N];map<int, int> mp;int main(){    int n, m;    int cas = 1;    while(~scanf("%d%d", &n, &m) && (n + m))    {        memset(G, INF, sizeof(G));        for(int i = 0 ; i < MAX_N ; i++)            G[i][i] = 0;        mp.clear();        int t = 0;        if(!mp.count(n))        {            mp[n] = t++;        }        if(!mp.count(m))        {            mp[m] = t++;        }        int u = mp[n];        int v = mp[m];        G[u][v] = 1;        while(scanf("%d%d", &n, &m) && (n + m))        {            if(!mp.count(n))            {                mp[n] = t++;            }            if(!mp.count(m))            {                mp[m] = t++;            }            int u = mp[n];            int v = mp[m];            G[u][v] = 1;        }        int cnt = mp.size();        int sum = 0;        for(int k = 0 ; k < cnt ; k++)            for(int i = 0 ; i < cnt ; i++)                for(int j = 0 ; j < cnt ; j++)                {                    G[i][j] = min(G[i][j], G[i][k] + G[k][j]);                }        for(int i = 0 ; i < cnt ; i++)            for(int j = 0 ; j < cnt ; j++)                {                    sum += G[i][j];                }        double ans = (sum + 0.0)/ (cnt * (cnt - 1));        printf("Case %d: average length between pages = %.3f clicks\n", cas++, ans);    }    return 0;}


0 0