PTA 5-7 六度空間 (30) - 圖 - BFS


題目:http://pta.patest.cn/pta/test/15/exam/4/question/715

PTA - 數據結構與算法題目集(中文)- 5-7

“六度空間”理論又稱作“六度分隔(Six Degrees of Separation)”理論。這個理論可以通俗地闡述為:“你和任何一個陌生人之間所間隔的人不會超過六個,也就是說,最多通過五個人你就能夠認識任何一個陌生人。”如圖6.4所示。


圖6.4 六度空間示意圖

假如給你一個社交網絡圖,請你對每個節點計算符合“六度空間”理論的結點占結點總數的百分比。

輸入格式說明:

輸入第1行給出兩個正整數,分別表示社交網絡圖的結點數N (1<N<=104,表示人數)、邊數M(<=33*N,表示社交關系數)。隨后的M行對應M條邊,每行給出一對正整數,分別是該條邊直接連通的兩個結點的編號(節點從1到N編號)。

輸出格式說明:

對每個結點輸出與該結點距離不超過6的結點數占結點總數的百分比,精確到小數點后2位。每個結節點輸出一行,格式為“結點編號:(空格)百分比%”。

輸入樣例:
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%

解析:[如圖]

image

代碼:

#include <iostream>
#include <fstream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
const int maxn=10005;

int vertices, edges;
vector<int> G[maxn];	//每個vector結構的元素表示:與數組下標代表的結點有邊的結點 
bool vis[maxn]; 	//是否訪問過
		
int BFS(int v)
{
	for(int i=0; i<maxn; i++)
		vis[i]=false;
	int tail; 	//用於記錄每層壓入時的結點 
	int last=v; 	//記錄每層的最后一個元素:該層壓入之后彈出之前更新:last=temp; 
	int count=1;
	int level=0;

	vis[v]=true;
	queue<int> q;
	q.push(v);
	
	while(!q.empty())
	{
		int x=q.front();	//彈出x 
		q.pop();
		for(int j=0; j<G[x].size(); j++)	//x的一圈壓入隊列 
		{
			if(!vis[G[x][j]])	//若未被訪問過:訪問並壓入隊列 
			{
				vis[G[x][j]]=true;				
				q.push(G[x][j]);
				tail=G[x][j];	//記錄壓入的結點
				count++;
			}	
		}
		if(x==last) //一層全部彈出,准備開始彈下一層:彈出的(x)=當前層最后一個元素(last) 
		{
			last=tail;    //一層全都壓入完后,更新last 
			level++; 
		}
		if(level==6)
			break;	
	}
	return count;
}
int main(int argc, char** argv) {	
	int x,y;
	cin >> vertices >> edges;
	//ifstream fin("test.txt");
	//fin >> vertices >> edges;
	
	for(int i=1; i<=edges; i++)
	{
		cin >> x >> y;
		//fin >> x >> y;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	for(int j=1; j<=vertices; j++)
	{
		//cout << BFS(j) << endl;
		printf("%d: %.2lf%%\n", j, BFS(j)*1.0/vertices*100.0); //格式輸出 
	}
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM