UVA 821 Page Hopping 网页跳跃(BFS,简单)
题意:
给一个无权有向图,可认为边的长度为1,求两点间的平均长度(即所有点对的长度取平均),保留3位小数。保证任意点对都可达。
思路:
简单题。直接穷举每个点,进行BFS求该点到其他点的距离。累加后除去边数即可。
1 #include <bits/stdc++.h> 2 #define LL long long 3 #define pii pair<int,int> 4 #define INF 0x7f7f7f7f 5 using namespace std; 6 const int N=110; 7 int g[N][N]; 8 int dis[N]; 9 10 map<int,int> mapp; 11 int BFS(int s,int n) 12 { 13 memset(dis,0,sizeof(dis)); 14 deque<int> que(1,s); 15 dis[s]=INF; 16 int len=0; 17 while(!que.empty()) 18 { 19 len++; 20 int siz=que.size(); 21 for(int i=0; i<siz; i++) 22 { 23 int x=que.front(); 24 que.pop_front(); 25 for(int j=1; j<=n; j++) 26 { 27 if(!dis[j] && g[x][j]) 28 { 29 dis[j]=len; 30 que.push_back(j); 31 } 32 } 33 } 34 } 35 int ans=0; 36 for(int i=1; i<=n; i++) if(dis[i]<INF) ans+=dis[i]; 37 return ans; 38 } 39 40 double cal(int n) 41 { 42 int ans=0; 43 for(int i=1; i<=n; i++) 44 ans+=BFS(i, n); 45 return (double)ans/(n*(n-1)); 46 } 47 48 int main() 49 { 50 freopen("input.txt", "r", stdin); 51 52 int a, b, j=0; 53 while(1) 54 { 55 mapp.clear(); 56 memset(g,0,sizeof(g)); 57 int cnt=0; 58 while(scanf("%d%d",&a,&b),a+b) 59 { 60 if(!mapp[a]) mapp[a]=++cnt; 61 if(!mapp[b]) mapp[b]=++cnt; 62 g[mapp[a]][mapp[b]]=1; 63 } 64 if(!cnt) return 0; 65 printf("Case %d: average length between pages = %.3f clicks\n", ++j, cal(cnt)); 66 67 } 68 return 0; 69 }