05-图3. 六度空间 (30)
时间限制
1500 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图6.4所示。
图6.4 六度空间示意图
“六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用。但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而由于历史的原因,这样的研究具有太大的局限性和困难。随着当代人的联络主要依赖于电话、短信、微信以及因特网上即时通信等工具,能够体现社交网络关系的一手数据已经逐渐使得“六度空间”理论的验证成为可能。
假如给你一个社交网络图,请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比。
输入格式说明:
输入第1行给出两个正整数,分别表示社交网络图的结点数N (1<N<=104,表示人数)、边数M(<=33*N,表示社交关系数)。随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个结点的编号(节点从1到N编号)。
输出格式说明:
对每个结点输出与该结点距离不超过6的结点数占结点总数的百分比,精确到小数点后2位。每个结节点输出一行,格式为“结点编号:(空格)百分比%”。
样例输入与输出:
序号 | 输入 | 输出 |
1 |
10 9 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 |
1: 70.00% 2: 80.00% 3: 90.00% 4: 100.00% 5: 100.00% 6: 100.00% 7: 100.00% 8: 90.00% 9: 80.00% 10: 70.00% |
2 |
10 8 1 2 2 3 3 4 4 5 5 6 6 7 7 8 9 10 |
1: 70.00% 2: 80.00% 3: 80.00% 4: 80.00% 5: 80.00% 6: 80.00% 7: 80.00% 8: 70.00% 9: 20.00% 10: 20.00% |
3 |
11 10 1 2 1 3 1 4 4 5 6 5 6 7 6 8 8 9 8 10 10 11 |
1: 100.00% 2: 90.91% 3: 90.91% 4: 100.00% 5: 100.00% 6: 100.00% 7: 100.00% 8: 100.00% 9: 100.00% 10: 100.00% 11: 81.82% |
4 |
2 1 1 2 |
1: 100.00% 2: 100.00% |
这里需要注意:
1.printf中百分号的输出。
2.比较运行结果。当使用new时,例如bool *vis=new bool[5],sizeof(vis)==1!!而不是5;但是如果是数组bool vis[5],sizeof(vis)==5!!
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int main(){ 5 bool vis=new bool[5]; 6 cout<<sizeof(vis)<<endl;//ans:1 7 bool v[5]; 8 cout<<sizeof(v)<<endl;//ans:5 9 char c[5]; 10 cout<<sizeof(c)<<endl;//ans:5 11 int t[5]; 12 cout<<sizeof(t)<<endl;//ans:20 13 return 0; 14 }
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<queue> 6 #include<vector> 7 #include<map> 8 #include<cmath> 9 #include<string> 10 using namespace std; 11 struct node 12 { 13 int v; 14 node *next; 15 node() 16 { 17 next=NULL; 18 } 19 }; 20 bool vis[10005]; 21 int main() 22 { 23 //freopen("D:\INPUT.txt","r",stdin); 24 int n,m; 25 while(scanf("%d%d",&n,&m)!=EOF) 26 { 27 node *h=new node[n+1]; 28 int i,a,b; 29 node *p; 30 for(i=0; i<m; i++) 31 { 32 scanf("%d %d",&a,&b); 33 p=new node(); 34 p->v=b; 35 p->next=h[a].next; 36 h[a].next=p; 37 p=new node(); 38 p->v=a; 39 p->next=h[b].next; 40 h[b].next=p; 41 } 42 for(i=1; i<=n; i++) 43 { 44 memset(vis,false,sizeof(vis)); 45 queue<int> q; 46 q.push(i); 47 vis[i]=true; 48 int level=0,last=i,tail,cur,count=1; 49 while(!q.empty()) 50 { 51 cur=q.front(); 52 q.pop(); 53 p=h[cur].next; 54 while(p) 55 { 56 if(!vis[p->v]) 57 { 58 q.push(p->v); 59 vis[p->v]=true; 60 count++; 61 tail=p->v; 62 } 63 p=p->next; 64 } 65 if(cur==last) 66 { 67 level++; 68 last=tail; 69 } 70 if(level==6) break; 71 } 72 printf("%d: %.2lf%% ",i,1.0*count*100/n); 73 } 74 delete []h; 75 } 76 return 0; 77 }