题意:研究证明,互联网上任何一个网页在平均情况下最多只需要单击19次就可以到达任意一个网页。如果把网页看成一个有向图中的结点,则该图中任意两点间最短距离的平均值为19。现在输入一个n个点的有向图,假定任意两个点之间都能互相到达,求任意两点最短距离的平均值。
题解:直接使用floyd,注意题中点出现不连续,属于WF的签到题吧
附上代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e2+50;
const int inf=0x3f3f3f3f;
int dp[maxn][maxn];
int main()
{
int u,v;
int kase=1;
for(;;){
scanf("%d%d",&u,&v);
if(u==0&&v==0){
break;
}else{
for(int i=1;i<maxn;i++){
for(int j=1;j<maxn;j++){
if(i==j){
dp[i][i]=0;
}else{
dp[i][j]=inf;
}
}
}
int n=-1;
n=max(n,max(u,v));
dp[u][v]=1;
while(scanf("%d%d",&u,&v)){
n=max(n,max(u,v));
if(u==0&&v==0){
break;
}else{
dp[u][v]=1;
}
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
}
}
}
int sum=0,cnt=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dp[i][j]!=inf&&i!=j){
sum+=dp[i][j];
cnt++;
}
}
}
double ave=sum*1.0/cnt;
printf("Case %d: average length between pages = %.3f clicks\n",kase++,ave);
}
}
return 0;
}