题目:https://vjudge.net/problem/UVA-821
见紫书P379
这题我没看到题目已经假定任意两点之间有路,不然还要保存给的点,有了这条件就简单多了,G[i][j]!=INF就说明i和j是给出的两个点(有路),直接循环两次,只要距离小于INF,就累加。
#include<bits/stdc++.h>
const int maxn=105;
const int INF=0x3f3f3f3f;
typedef long long LL;
using namespace std;
int G[maxn][maxn];
int N;
void floyd()
{
for(int k=1;k<=100;k++)
for(int i=1;i<=100;i++)
for(int j=1;j<=100;j++)
G[i][j]=min(G[i][j],G[i][k]+G[k][j]);
}
int main()
{
// freopen("E:\\ACM\\test.txt","r",stdin);
int Case=1;
int s,e;
while(cin>>s>>e,s+e)
{
memset(G,INF,sizeof(G));
for(int i=0;i<maxn;i++) G[i][i]=0;
G[s][e]=1;
while(cin>>s>>e,s+e) G[s][e]=1;
floyd();
double sum=0;
for(int i=1;i<=100;i++)
{
for(int j=1;j<=100;j++)
{
if(i!=j&&G[i][j]<INF) //关键这里
sum+=G[i][j];
}
}
sum/=N*(N-1);
printf("Case %d: average length between pages = %.3f clicks\n",Case++,sum);
}
return 0;
}