# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
244499 | cheeheng | Pipes (CEOI15_pipes) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <cstdio>
#include <algorithm>
#include <bitset>
using namespace std;
const int MAX_N = 30005;
vector<short> AdjList[MAX_N];
bitset<MAX_N> visited;
short dp[MAX_N];
short depth[MAX_N];
void dfs(short u, short p2, short d = 0){
if(visited[u]){return;}
depth[u] = d;
visited[u] = true;
dp[u] = 0;
int cnt = 0;
for(int v: AdjList[u]){
if(!visited[v]){
dfs(v, u, d+1);
dp[u] += dp[v];
}else if( (v != p2 || cnt >= 1) && depth[u] > depth[v]){
// this is a back edge
//printf("%d %d is a back edge\n", u, v);
dp[u] ++;
dp[v] --;
}else if(v == p2){cnt ++;}
}
if(dp[u] == 0 && p2 != -1){
printf("%d %d\n", u, p2);
}
//printf("dp[%d]=%d\n", u, dp[u]);
}
int main(){
int N, M;
scanf("%d%d", &N, &M);
for(int i = 0; i < M; i ++){
int a, b;
scanf("%d%d", &a, &b);
AdjList[a].push_back(b);
AdjList[b].push_back(a);
}
//memset(dfs_low, -1, sizeof(dfs_low));
//memset(dfs_num, -1, sizeof(dfs_num));
//memset(p, -1, sizeof(p));
int temp = 0;
for(int i = 1; i <= N; i ++){
if(!visited[i]){
dfs(i, -1);
}
}
/*for(int i = 1; i <= N; i ++){
printf("%d %d\n", i, dp[i]);
}*/
return 0;
}