PTA 5-7(中文) 六度空间 (30) - 图 - BFS

“六度空间”理论又称作“六度分隔(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%

解析:[如图]

代码:

#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;
}
时间: 2024-10-13 04:46:01

PTA 5-7(中文) 六度空间 (30) - 图 - BFS的相关文章

05-图3. 六度空间 (30)

05-图3. 六度空间 (30) 时间限制 1500 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard "六度空间"理论又称作"六度分隔(Six Degrees of Separation)"理论.这个理论可以通俗地阐述为:"你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人."如图6.4所示. 图6.4 六度空间示意图 "六度空间"理论虽然

生化危机 邻接表存图+BFS

生化危机 发布时间: 2015年10月10日 18:05   时间限制: 1000ms   内存限制: 256M 描述 X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败了, 他在蜥蜴身上实验的时候, 蜥蜴发生了变异, 更糟糕的是, 蜥蜴逃出了生化实验室. 恐怖的事情发生了, 疫情以X博士所在的城市为中心向四周扩散开, 最终, 整个地球上的城市都被感染了.假设整个地球一共有N个城市, 这N个城市是连通的, 有N-1条通道把他们连接起来.病毒会以一座城市为中心,在一天

PAT Advanced 1034 Head of a Gang (30) [图的遍历,BFS,DFS,并查集]

题目 One way that the police finds the head of a gang is to check people's phone calls. If there is a phone call between A and B, we say that A and B is related. The weight of a relation is defined to be the total time length of all the phone calls mad

PAT Advanced 1076 Forwards on Weibo (30) [图的遍历,BFS,DFS]

题目 Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may follow many other users as well. Hence a social network is formed with followers relations. When a user makes a post on Weibo, all his/her followe

POJ2251Dungeon Master(三维图)(BFS)

Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17444   Accepted: 6790 Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled

05-3. 六度空间 (PAT) - 图的遍历问题

“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论.这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人.”如图6.4所示. 图6.4 六度空间示意图 “六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用.但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标.然而由于历史的原因,这样的研究具有太大的局限性和困难.随着当代人的联络主要依赖于电话.短信.微信以及因特网

算法系列之图--BFS

广度优先搜索以源结点s为出发点,算法始终将已发现和未发现结点之间的边界,沿其广度方向向外扩展.也即算法需要在发现所有距离源结点s为k的所有结点之后才会去发现距离源结点距离为k+1的其他结点. talk is cheap,show me the code!上具体的代码,最容易解释这一切. 该例子是以无向图为基础,代码中注释有具体说明,不在解释每一步: 1 #include <iostream> 2 #include <list> 3 #include <queue> 4

(图 BFS)走迷宫

题目: 给一个迷宫,求出从起点到终点的路径.迷宫 src.txt 文件内容如下,第一行是迷宫的行列数,后面行是迷宫,1表示可行走,0表示不可以通过,起点是最左上角,终点是最右下角: 1 6 5 2 1 1 0 1 1 3 1 0 1 1 1 4 1 0 1 0 0 5 1 0 1 1 1 6 1 1 1 0 1 7 1 1 1 1 1 解析: 其实就是图的广度优先遍历. 代码及运行结果: 1 #include <iostream> 2 #include <queue> 3 #inc

ACM:图BFS,迷宫

称号: 网络格迷宫n行m单位列格组成,每个单元格无论空间(使用1表示),无论是障碍(使用0为了表示).你的任务是找到一个动作序列最短的从开始到结束,其中UDLR同比分别增长.下一个.左.向右移动到下一个单元格. 不论什么时候都不能在障碍格中.也不能走到迷宫之外. 起点和终点保证是空地. 分析:图的BFS. #include <iostream> #include <string> #include <queue> using namespace std; const i