답안 #527367

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
527367 2022-02-17T09:54:55 Z jamielim Pipes (CEOI15_pipes) C++14
20 / 100
1453 ms 14372 KB
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define mp make_pair
#define pb emplace_back
#define ALL(x) x.begin(),x.end()
#define SZ(x) (int)x.size()
typedef long long ll;
typedef pair<int,int> ii;
typedef pair<ii,ii> i4;
const int MOD=1000000007;
const int INF=1012345678;
const ll LLINF=1012345678012345678LL;
const double PI=3.1415926536;
const double EPS=1e-14;

const int MAXN=100005;
int n,m;
int par[MAXN],par2[MAXN]; // par, depth
int root(int x){return par[x]=(par[x]==x?x:root(par[x]));}
int root2(int x){return par2[x]=(par2[x]==x?x:root2(par2[x]));}
vector<int> adj[MAXN]; // only stores at most 2*tree

bool vis[MAXN];
int low[MAXN];
int ctr=0;
void dfs(int x){
	vis[x]=1;
	par2[x]=ctr;
	low[x]=ctr++;
	for(int i:adj[x]){
		if(i==par[x])continue;
		if(!vis[i]){
			par[i]=x;
			dfs(i);
			if(low[i]>par2[x])printf("%d %d\n",x+1,i+1);
			low[x]=min(low[x],low[i]);
		}else low[x]=min(low[x],par2[i]);
	}
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)par[i]=par2[i]=i;
	int a,b;
	for(int i=0;i<m;i++){
		scanf("%d%d",&a,&b);a--;b--;
		//if a,b are in different trees, merge the two trees
		int ra=root(a),rb=root(b);
		if(ra!=rb){
			par[ra]=rb;
			adj[a].pb(b);
			adj[b].pb(a);
			continue;
		}
		//otherwise, take note that later we have to get rid of the entire cycle
		int r2a=root2(a),r2b=root2(b);
		if(r2a!=r2b){
			par2[r2a]=par2[r2b];
			adj[a].pb(b);
			adj[b].pb(a);
		}
	}
	memset(par,-1,sizeof(par));
	memset(par2,-1,sizeof(par2));
	memset(low,-1,sizeof(low));
	for(int i=0;i<n;i++)if(!vis[i])dfs(i);
}

Compilation message

pipes.cpp: In function 'int main()':
pipes.cpp:45:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   45 |  scanf("%d%d",&n,&m);
      |  ~~~~~^~~~~~~~~~~~~~
pipes.cpp:49:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   49 |   scanf("%d%d",&a,&b);a--;b--;
      |   ~~~~~^~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 3788 KB Output is correct
2 Incorrect 3 ms 3788 KB Wrong number of edges
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 4208 KB Output is correct
2 Incorrect 9 ms 4044 KB Wrong number of edges
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 131 ms 5616 KB Output is correct
2 Incorrect 134 ms 5520 KB Wrong number of edges
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 221 ms 6824 KB Wrong number of edges
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 399 ms 8336 KB Output is correct
2 Correct 327 ms 7624 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 525 ms 10832 KB Output is correct
2 Incorrect 409 ms 7884 KB Wrong number of edges
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 747 ms 11832 KB Output is correct
2 Incorrect 719 ms 9372 KB Wrong number of edges
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1002 ms 13540 KB Output is correct
2 Incorrect 911 ms 9460 KB Wrong number of edges
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1336 ms 14372 KB Output is correct
2 Incorrect 1158 ms 9160 KB Wrong number of edges
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1453 ms 13204 KB Output is correct
2 Correct 1373 ms 10948 KB Output is correct