本质上是需要做一个分层的广度优先搜索,只需要对每一个从队列中取出来的节点进行广度优先前用一个数记录接下来的多少个节点是属于同一层的,给相应的变量赋值即可。
#include <iostream>
#include <list>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
bool** road = new bool*[n];
bool* visit = new bool[n];
int* ans = new int[n];
list <int> l;
for (int i = 0; i <= n - 1; i++)
{
road[i] = new bool[n];
visit[i] = false;
ans[i] = -1;
for (int j = 0; j <= n - 1; j++)
{
road[i][j] = false;
}
}
for (int i = 0; i <= m - 1; i++)
{
int x, y;
cin >> x >> y;
road[x-1][y-1] = true;
road[y-1][x-1] = true;
}
int start = 0;
l.push_back(0);
visit[0] = true;
int count =0;
ans[0] = 0;
while(!l.empty())
{
count++;
int j = l.size();
while (j--)
{
start = l.front();
l.pop_front();
for (int i = 0; i <= n - 1; i++)
{
if (road[start][i] && !visit[i])
{
ans[i] = count;
visit[i] = true;
l.push_back(i);
}
}
}
}
for (int i = 0; i <= n - 1; i++)
{
cout << ans[i] << " ";
}
cout << endl;
}