摘自计蒜客:http://www.jisuanke.com/course/35/7317
小明外出游玩,景区一共有 N 个地方可以玩耍,编号从 1 到 N,并且知道了小明现在所在景点的编号 C,以及 M 条路径。现在求小明到每个地方分别需要经过多少个地方?
输入格式:
第一行输入三个正整数 N,M,C。代表蒜头君想去 N 个地方,有 M 条路径,蒜头君在编号为 C 的地方。1≤N,C≤1000, 1≤C≤N, 1≤M≤10000。
保证没有重复边,且图中所有点互相连通。
输出格式:
输出 N 行,按编号从小到大,输出结果。第 i行表示蒜头君到编号为 i 的地方,需要经过多少个地方。
样例1
输入:
5 5 2 1 2 2 3 2 4 3 4 3 5
输出:
1 0 1 1 2
代码实现(一种解法,应该有更好的解法):
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
class Graph {
private:
int n;
bool *visited;
vector<int> *edges;
int *minlen;
public:
Graph(int input_n) {
n = input_n;
edges = new vector<int>[n];
visited = new bool[n];
minlen = new int[n];
memset(visited, 0, n);
memset(minlen, 0, n*sizeof(int));
}
~Graph() {
delete[] edges;
delete[] visited;
delete[] minlen;
}
void insert(int x, int y) {
edges[x].push_back(y);
edges[y].push_back(x);
}
void bfs(int start_vertex) {
int len = 1,last,nlast;
queue<int> bfs_queue;
bfs_queue.push(start_vertex);
visited[start_vertex] = true;
last = start_vertex;
while (!bfs_queue.empty()) {
int vertex = bfs_queue.front();
for (int adj_vertex:edges[vertex]) {
if (!visited[adj_vertex]) {
visited[adj_vertex] = true;
bfs_queue.push(adj_vertex);
nlast = adj_vertex;
minlen[adj_vertex] = len;
}
}
bfs_queue.pop();
if(vertex == last) {
last = nlast;
len++;
}
}
for(int i=1; i<n; i++) {
cout << minlen[i] << endl;
}
}
};
int main() {
int n, m, k;
cin >> n >> m >> k;
Graph g(n+1);
for (int i = 0; i < m; ++i) {
int x, y;
cin >> x >> y;
g.insert(x, y);
}
g.bfs(k);
return 0;
}