题目
思路
根据陈越老师所给的思路,对每个节点进行广度优先搜索,用队列记录每一个节点,记录搜索过程中累积访问的节点数。
当队列为空时,判断其是否等于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)-------->设置输出的浮点数有效数字的位数