hdu 5876 Sparse Graph(BFS+并查集)
2016-10-01 22:49
399 查看
题目链接:hdu 5876 Sparse Graph
/******************
* Author: Jerakrs
* Time: 2016.10.01
* Problem: 给定一张图不存在边,求从起点S到各个点的距离
* Solve: BFS,遍历点时可以用并查集做路劲压缩,经过的点不需要重复检查
* Complexity: o( n ) 并查集压缩路径复杂度为常数
******************/
#include <cstdio>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 200005;
int N, M, S, F[maxn], A[maxn];
set<int> G[maxn];
int get(int x) {
return x == F[x] ? x : F[x] = get(F[x]);
}
void init () {
scanf("%d%d", &N, &M);
memset(A, -1, sizeof(A));
for (int i = 1; i <= N + 1; i++) {
F[i] = i;
G[i].clear();
}
int u, v;
for (int i = 0; i < M; i++) {
scanf("%d%d", &u, &v);
G[u].insert(v);
G[v].insert(u);
}
scanf("%d", &S);
}
void solve() {
queue<int> que;
que.push(S);
A[S] = 0;
F[S] = S + 1;
while (!que.empty()) {
int u = que.front();
que.pop();
for (int i = get(1); i <= N; i = get(i+1)) {
if (G[u].find(i) != G[u].end() || i == u)
continue;
A[i] = A[u] + 1;
F[i] = i + 1;
que.push(i);
}
}
int end = (S == N ? N - 1 : N);
for (int i = 1; i <= N; i++) {
if (i == S)
continue;
printf("%d%c", A[i], i == end ? '\n' : ' ');
}
}
int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
init();
solve();
}
return 0;
}
/******************
* Author: Jerakrs
* Time: 2016.10.01
* Problem: 给定一张图不存在边,求从起点S到各个点的距离
* Solve: BFS,遍历点时可以用并查集做路劲压缩,经过的点不需要重复检查
* Complexity: o( n ) 并查集压缩路径复杂度为常数
******************/
#include <cstdio>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 200005;
int N, M, S, F[maxn], A[maxn];
set<int> G[maxn];
int get(int x) {
return x == F[x] ? x : F[x] = get(F[x]);
}
void init () {
scanf("%d%d", &N, &M);
memset(A, -1, sizeof(A));
for (int i = 1; i <= N + 1; i++) {
F[i] = i;
G[i].clear();
}
int u, v;
for (int i = 0; i < M; i++) {
scanf("%d%d", &u, &v);
G[u].insert(v);
G[v].insert(u);
}
scanf("%d", &S);
}
void solve() {
queue<int> que;
que.push(S);
A[S] = 0;
F[S] = S + 1;
while (!que.empty()) {
int u = que.front();
que.pop();
for (int i = get(1); i <= N; i = get(i+1)) {
if (G[u].find(i) != G[u].end() || i == u)
continue;
A[i] = A[u] + 1;
F[i] = i + 1;
que.push(i);
}
}
int end = (S == N ? N - 1 : N);
for (int i = 1; i <= N; i++) {
if (i == S)
continue;
printf("%d%c", A[i], i == end ? '\n' : ' ');
}
}
int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
init();
solve();
}
return 0;
}
相关文章推荐
- HDU 5876Sparse Graph (补图上BFS)
- HDU 5876 Sparse Graph 【补图最短路 BFS】(2016 ACM/ICPC Asia Regional Dalian Online)
- HDU 5876 Sparse Graph(2016 ACM/ICPC Asia Regional Dalian Online)
- hdu 5876 Sparse Graph(补图最短路)
- HDU 5876 Sparse Graph(bfs求解补图中的单源最短路)——2016 ACM/ICPC Asia Regional Dalian Online
- hdu 5876 Sparse Graph【最短路+思维】好题
- 【2016-大连赛区网络赛-I】补图最短路(Sparse Graph,hdu 5876)
- HDU 5876 Sparse Graph 大连网络赛
- hdu 5876 Sparse Graph(补图最短路) 2016 ACM/ICPC Asia Regional Dalian Online 1009
- HDU 5876 Sparse Graph 【补图最短路 BFS】(2016 ACM/ICPC Asia Regional Dalian Online)
- Hdu 5876 Sparse Graph bfs 变型最短路
- HDU 5876 Sparse Graph(补图+BFS最短路)
- HDU 5876 Sparse Graph(补图中求最短路)
- hdu_5876_Sparse Graph(补图BFS)
- HDU 5876 Sparse Graph (补图BFS) 2016 ACM/ICPC Asia Regional Dalian Online
- HDU 5876 Sparse Graph 补图BFS
- hdu 5876 Sparse Graph bfs 链表优化
- HDU 5876 Sparse Graph(bfs+set)
- HDU 5876 Sparse Graph (求补图上最短路径、bfs、优化)
- hdu 5876 Sparse Graph 无权图bfs求最短路