给出能相互到达的网页,输出在给出的网页中相互到达需要点击几次,首先离散化,然后用Floyd求少点击次数,枚举求平均点击次数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include<cstdio> #include<cstring> #include<algorithm> #include<map> using namespace std; const int maxn=110; const int inf=0x3f3f3f3f; int d[maxn][maxn]; map<int,int> id; int main(){ int n,u,v,t=0; while(~scanf("%d%d",&u,&v)&&(u||v)){ memset(d,0x3f,sizeof d); id.clear(); n=0; if(!id.count(u)) id[u]=++n; if(!id.count(v)) id[v]=++n; d[id[u]][id[v]]=1; while(~scanf("%d%d",&u,&v)&&(u||v)){ if(!id.count(u)) id[u]=++n; if(!id.count(v)) id[v]=++n; d[id[u]][id[v]]=1; } for(int k=1;k<=n;++k) for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) d[i][j]=min(d[i][j],d[i][k]+d[k][j]); int sum=0; for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) if(i!=j&&d[i][j]!=inf) sum+=d[i][j]; printf("Case %d: average length between pages = %.3lf clicks\n",++t,double(sum)/(n*(n-1))); } return 0; }
|
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **