题目
输入
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%
思路
BFS应该没啥大问题,利用queue存放pair<int,int>就可以
注意使用BFS时候的mark数组记录是否便利某一个点的问题
代码
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
int main()
{
int N, M;
cin >> N >> M;
vector<int>* pv = new vector<int>[N + 2];
for(int i = 0; i < M; i++)
{
int start, end;
cin >> start >> end;
pv[start].push_back(end);
pv[end].push_back(start);
}
for(int i = 1; i <= N; i++)
{
int mark[N + 2];
memset(mark, 0 , sizeof(mark));
queue<pair<int,int>> q;//first->end second-> 距离
int sum = 1;//特别注意,自己也算
//如果设置sum为0可能会导致平凡点记为0的情况,但是自己对于自己是可达的
q.push({i,0});
mark[i] = 1;//对应sum
while(!q.empty())
{
int mid = q.front().first;
int dis = q.front().second;
q.pop();
if(dis >= 6)
break;
for(auto end : pv[mid])
{
//BFS在塞入的时候就顺便进行计数
//如果mark为就++,为1不管,因为已经遍历过了
if(!mark[end])
{
q.push({end, dis + 1});
sum++;
mark[end] = 1;
}
}
}
printf("%d: %.2f%\n", i, double(sum)/N * 100);
}
return 0;
}