#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
#include <vector>
#include <set>
using namespace std;
const int maxn = 2e5 + 10;
const int INF = 1e9 + 7;
//vector <int> G[maxn];
//bool vis[maxn] = {0};
set <int> s1;
set <int> s2;
set <int> g[maxn];
int d[maxn] = {0};
int main () {
ios_base :: sync_with_stdio(false);
int t;
cin >> t;
while (t--) {
int n,m;
cin >> n >> m;
s1.clear();
s2.clear();
for (int i = 1;i <= n; ++ i) {
// G[i].clear();
g[i].clear();
d[i] = INF;
s2.insert (i);
}
// int ans = 0;
for (int i = 0;i < m; ++ i) {
int x,y;
cin >> x >> y;
g[x].insert(y);
g[y].insert(x);
}
int s;
cin >> s;
s2.erase(s);
s1.insert(s);
d[s] = 0;
queue<int> q;
while (!q.empty()) q.pop();
q.push(s);
// set <int> :: iterator it;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = 1;i <= n; ++ i) {
if (s2.find(i) != s2.end() && g[u].find(i) == g[u].end()) {
d[i] = min (d[i],d[u] + 1);
q.push(i);
s2.erase(i);
}
}
if (s2.size() == 0) break;
}
int i = 1;
for (;; ++ i) {
if (s != i) {
if (d[i] == INF) cout << -1;
else cout << d[i];
++ i;
break;
}
}
for (;i <= n; ++ i) {
if (i == s) continue;
if (d[i] != INF)
cout << ' ' << d[i];
else {
cout << ' ' << -1;
}
}
cout << endl;
}
return 0;
}
HDU 补图最短路
最新推荐文章于 2018-08-31 19:11:46 发布