UVA 821 Page Hopping

Floyd水题

#include<cstdio>
#include<iostream>
using namespace std;
int N;
const int MAXN=1111;
int Map[MAXN][MAXN],b[MAXN],path[MAXN][MAXN];
int u[MAXN],v[MAXN];
void init()
{
    int i,j;
    for(i=1; i<=N; i++)
        for(j=1; j<=N; j++)
        {
            Map[i][j]=99999999;
            path[i][j]=j;
        }
}
void floyd()
{
    int i,j,k;
    for(k=1; k<=N; k++)
        for(i=1; i<=N; i++)
            for(j=1; j<=N; j++)
                if(Map[i][k]!=99999999&&Map[k][j]!=99999999&&Map[i][j]>Map[i][k]+Map[k][j])
                {
                    Map[i][j]=Map[i][k]+Map[k][j];
                    path[i][j]=path[i][k];
                }
}
int main()
{
    int m,len,TOT;
    int TT=1;
    while(1)
    {
        int MA=-999999;
        TOT=0;
        scanf("%d%d",&u[TOT],&v[TOT]);
        if(u[TOT]>MA) MA=u[TOT];
        if(v[TOT]>MA) MA=v[TOT];
        if(u[TOT]==0&&v[TOT]==0) break;
        TOT++;
        while(1)
        {
            scanf("%d%d",&u[TOT],&v[TOT]);
            if(u[TOT]>MA) MA=u[TOT];
            if(v[TOT]>MA) MA=v[TOT];
            if(u[TOT]==0&&v[TOT]==0) break;
            TOT++;
        }
        N=MA; init();
        for(int ii=0;ii<TOT;ii++) Map[u[ii]][v[ii]]=1;
        floyd();
        int tot1=0,tot2=0;
        for(int i=1;i<=N;i++)
            for(int j=1;j<=N;j++)
            {
                if(i==j) continue;
                if(Map[i][j]!=99999999)
                {
                    tot1++;
                    tot2+=Map[i][j];
                }
            }
        printf("Case %d: average length between pages = %.3lf clicks
",TT++,1.0*tot2/tot1);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/4723575.html