# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
36031 |
2017-12-04T09:34:26 Z |
funcsr |
Pipes (CEOI15_pipes) |
C++14 |
|
495 ms |
14868 KB |
#include <bitset>
#include <cassert>
#include <vector>
#include <tuple>
#define rep(i, n) for (int i=0; i<(n); i++)
#define INF 1145141919
#define pb push_back
#define _1 first
#define _2 second
using namespace std;
typedef pair<int, int> P;
struct UnionFind {
int U[100000], R[100000];
UnionFind(int N) {
rep(i, N) U[i] = i, R[i] = 1;
}
int find(int x) {
if (U[x] == x) return x;
return U[x] = find(U[x]);
}
void unite(int x, int y) {
x = find(x), y = find(y);
if (x == y) return;
if (R[x] < R[y]) swap(x, y);
U[y] = x;
R[x] += R[y];
}
bool same(int x, int y) {
return find(x) == find(y);
}
};
int N, M;
vector<P> G[100000];
bool used[100000];
int R[100000], T[100000];
void dfs(int x, int pe, int r) {
used[x] = true;
R[x] = r;
for (P pp : G[x]) {
int t = pp._1;
if (pp._2 == pe) continue;
if (used[t]) {
if (R[x] > R[t]) T[x]++, T[t]--;
continue;
}
dfs(t, pp._2, r+1);
}
}
void dfs2(int x, int p) {
used[x] = true;
for (P pp : G[x]) {
int t = pp._1;
if (t == p || used[t]) continue;
dfs2(t, x);
T[x] += T[t];
}
if (p != -1 && T[x] == 0) printf("%d %d\n", x+1, p+1);
}
inline P read2() {
int u = 0, v = 0;
char f[15];
fgets(f, 15, stdin);
int h = 0;
while ('0' <= f[h] && f[h] <= '9') u = 10*u+(f[h++]-'0');
h++;
while ('0' <= f[h] && f[h] <= '9') v = 10*v+(f[h++]-'0');
return P(u, v);
}
signed main() {
scanf("%d %d", &N, &M);
UnionFind uf1(N), uf2(N);
rep(i, M) {
int u, v;
tie(u, v) = read2();
//scanf("%d %d", &u, &v);
u--, v--;
if (!uf1.same(u, v)) {
G[u].pb(P(v, i)), G[v].pb(P(u, i));
uf1.unite(u, v);
}
else if (!uf2.same(u, v)) {
G[u].pb(P(v, i)), G[v].pb(P(u, i));
uf2.unite(u, v);
}
}
rep(i, N) used[i] = false;
rep(i, N) if (!used[i]) dfs(i, -1, 0);
rep(i, N) used[i] = false;
rep(i, N) if (!used[i]) dfs2(i, -1);
return 0;
}
Compilation message
pipes.cpp: In function 'int main()':
pipes.cpp:77:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d", &N, &M);
~~~~~^~~~~~~~~~~~~~~~~
pipes.cpp: In function 'P read2()':
pipes.cpp:68:8: warning: ignoring return value of 'char* fgets(char*, int, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
fgets(f, 15, stdin);
~~~~~^~~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
3 ms |
2688 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
6 ms |
3200 KB |
Output is correct |
2 |
Correct |
6 ms |
3072 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
32 ms |
3200 KB |
Output is correct |
2 |
Correct |
31 ms |
2944 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
59 ms |
3832 KB |
Output is correct |
2 |
Correct |
56 ms |
3576 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
120 ms |
5560 KB |
Output is correct |
2 |
Correct |
87 ms |
5240 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
185 ms |
11316 KB |
Output is correct |
2 |
Correct |
156 ms |
8952 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
279 ms |
12544 KB |
Output is correct |
2 |
Correct |
233 ms |
9784 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
495 ms |
14856 KB |
Output is correct |
2 |
Correct |
339 ms |
11612 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
402 ms |
14868 KB |
Output is correct |
2 |
Correct |
390 ms |
11656 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
439 ms |
14328 KB |
Output is correct |
2 |
Correct |
420 ms |
11480 KB |
Output is correct |