【从0开始的刷题生活】PTA数据结构2019-秋 06-图3 六度空间 (30 分)

题目

原题地址
在这里插入图片描述
在这里插入图片描述

思路

根据陈越老师所给的思路,对每个节点进行广度优先搜索,用队列记录每一个节点,记录搜索过程中累积访问的节点数。
当队列为空时,判断其是否等于last,如果等于last则让level即层数+1,当集满六层时跳出while循环,返回记录的count值,再输出 count/N 即可
其中主要算法的伪代码如下
在这里插入图片描述

代码

#include <iostream>
#include <queue>
#include <iomanip>
#define maxn 1005
using namespace std;
bool visited[maxn]; 
struct pos{
	int vertex[maxn];
	int arcs[maxn][maxn];
}a;

void Output(double i,int j)
{
	cout<<j<<": "<<setiosflags(ios::fixed)<<setprecision(2)<<i*100<<"%"<<endl;
}
int BFS(int V);
void SDS();	
int n,m;
int main()
{
	cin>>n>>m;
	int q,p;
	for(int i=0;i<m;i++)
	{
		cin>>q>>p;
		a.arcs[q][p]=1;
		a.arcs[p][q]=1;
		a.vertex[q]=q;
		a.vertex[p]=p;
	}		

	SDS();
}
void SDS()
{
	for(int V=1;V<=n;V++){
		for(int i=1;i<=n;i++)
		visited[i]=false;
		
		Output(double(BFS(V))/n,V);
	}
}
int BFS(int V)
{
	visited[V]=true;
	queue<int> q;
	int count=1;
	int level=0;
	int last=V;
	int tail;
	q.push(V);
	while(!q.empty()){
		V=q.front();
		q.pop();
		for(int W=1;W<=n;W++)
			if(!visited[W] && a.arcs[V][W]){
				visited[W]=true;
				q.push(W);
				count++;
				tail=W;
			}
		if(V==last){
			level++;
			last=tail;
		}	
		if(level==6) break;
	}
	return count;
}

提交之后
在这里插入图片描述

写在后面

观察题目的测试数据,如果是简单一条链的话,那么就可以用一个循环链表来做,使用BFS算法的最主要目的是为了应对一般图和不连通图等情况。
在代码中用到了函数库 “iomanip” 这是c++中控制格式化输出的一个函数库,在本题中用到了两个设置浮点数格式的函数:

setiosflags(ios::fixed) -------->用小数点形式来显示数据
setprecision(2)-------->设置输出的浮点数有效数字的位数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值