题目大意:
最近的研究表明,互联网上任何一个网页在平均情况下最多只需要单击19次就能到达任 意一个其他网页。如果把网页看成一个有向图中的结点,则该图中任意两点间最短距离的平 均值为19。 输入一个n(1≤n≤100)个点的有向图,图中任意两点之间都相互可达,求任意两点间最 短距离的平均值。输入保证没有自环。
思路:
通过floyd算法跑出所有点之间的距离,然后遍历一遍就可以出结果了,因为n<=100,所以能够不超时
#include <stdio.h> #include <string.h> #include <math.h> #include <queue> #include <map> #include <vector> #include <algorithm> #include <iostream> using namespace std; #define inf 0x3f3f3f3f typedef long long ll; const int maxn=105; #define rep(i,n) for(int i=0;i<(n);i++) int n=0; int dp[maxn][maxn]; void floyd(){ rep(k,n+1){ rep(i,n+1){ rep(j,n+1){ dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]); } } } } void solve(int cas){ double ans=0,cnt=0; rep(i,n+1){ rep(j,n+1){ if(i!=j&&dp[i][j]!=inf){ ans+=dp[i][j]; cnt++; } } } printf("Case %d: average length between pages = %.3lf clicks ",cas,ans/cnt); } int main(){ int a,b; int cas=1; while(scanf("%d%d",&a,&b)==2&&!(!a&&!b)){ n=0; if(n<max(a,b))n=max(a,b); memset(dp,inf,sizeof(dp)); dp[a][b]=1; while(scanf("%d%d",&a,&b)==2&&!(!a&&!b)){ dp[a][b]=1; if(n<max(a,b))n=max(a,b); } floyd(); solve(cas); cas++; } }