悬关求调
查看原帖
悬关求调
1198194
zlqwq楼主2024/12/1 18:25

得了 2020

#include<iostream>
#include<vector>
#include<map>
#include<queue>
using namespace std;
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+(ch-'0');
		ch=getchar();
	}
	return x*f;
}
const int MAXN=2e5+5;
int n,m;
struct edge{
	int x,y;
}ed[MAXN];
vector<int> z[MAXN];
vector<int> g[MAXN];
int fa[MAXN];
int cd[MAXN];
int idx;
struct edgee{
	int next,to;
}e[MAXN];
bool vis[MAXN];
int head[MAXN];
int f[MAXN][20];
int dep[MAXN];
int rd[MAXN];
map<pair<int,int>,bool>mp;
void add(int u,int v){
	idx++;
	e[idx].next=head[u];
	e[idx].to=v;
	head[u]=idx;
}
void dfs(int x){
	f[x][0]=fa[x];
	for(int k=1;k<=20;++k){
		f[x][k]=f[f[x][k-1]][k-1];
	}
	if(!cd[x]){
		g[x].push_back(x);
		return;
	}
	for(int i=head[x];i;i=e[i].next){
		int v=e[i].to;
		if (v!=fa[x]){
			dep[v]=dep[x]+1;
			dfs(v);
			for(int j=0;j<g[v].size();++j){
				g[x].push_back(g[v][j]);
			}	
		}
	}
	return;
}
int lca(int x,int y){
	bool flag=0;
	if (dep[x]<dep[y]){
		swap(x,y);
		flag=1;
	}
	for(int k=20;k>=0;--k) {
		if(dep[f[x][k]]>=dep[y]){
			x=f[x][k];
		}
	}
	for(int k=20;k>=0;--k){
		if(f[x][k]!=f[y][k]){
			x=f[x][k];
			y=f[y][k];
		}
	}	
	if(flag){
		return y;
	}
	else{
		return x;
	}
}
signed main(){
	n=read();
	m=read();
	for(int i=1;i<=m;++i){
		int u,v;
		u=read();
		v=read();
		z[u].push_back(v);
		z[v].push_back(u);
		ed[i]=edge{u,v};
	}
	for(int i=1;i<=n;++i){
		cin>>fa[i];
		cd[fa[i]]++;
		add(fa[i],i);
		add(i,fa[i]);
	}
	dfs(1);
	idx=0;
	for(int k=1;k<=n;++k){
		if (!cd[k]){
			for(int i=0;i<z[k].size();++i){
				int v=z[k][i];
				if(v!=fa[k]&&dep[v]==dep[fa[k]]){
					int LCA=lca(v,fa[k]);
					for(int j=0;j<g[LCA].size();++j){
						add(k,g[LCA][j]);
						rd[g[LCA][j]]++;
					}
				}
			}
		}
	}
	queue<int>q;
	for(int i=1;i<=n;++i){
		if (!rd[i]&&!cd[i]){
			q.push(i);
			vis[i]=1;
		}
	}
	while(q.size()){
		int x=q.front();
		q.pop();
		int xx=x;
		while(fa[x]){
			cout<<fa[x]<<' '<<x<<"\n";
			mp[make_pair(fa[x],x)]=1;
			mp[make_pair(x,fa[x])]=1;
			x=fa[x];
			if(vis[x]){
				break;
			}
			vis[x]=1;
		}
		for(int i=head[xx];i;i=e[i].next){
			int v=e[i].to;
			rd[v]--;
			if (!rd[v]&&!vis[v]){
				vis[v]=1;
				q.push(v);	
			}
		}
	}
	for(int i=1;i<=m;++i){
		if (mp[make_pair(ed[i].x,ed[i].y)]==1){
			mp[make_pair(ed[i].x,ed[i].y)]=0;
			mp[make_pair(ed[i].y,ed[i].x)]=0;
		}
		else{
			cout<<ed[i].x<<" "<<ed[i].y<<"\n";
		}
	}
	return 0;
}
2024/12/1 18:25
加载中...