???为什么只能过4个点嘞,有大佬康康吗?求求了
查看原帖
???为什么只能过4个点嘞,有大佬康康吗?求求了
445896
I_m_FW楼主2021/11/7 23:29
#include <bits/stdc++.h>
using namespace std;
const int N=3e5+10;
int to[N],ne[N],h[N],tot;
int n,m,fa[N],root=1;
int f[N][32],d[N];
int sum[N],ans,k,pr[N];
bool vis[N],st[N],sw[N];
struct node{
	int x,y,w;
}a[N];
struct nn{
	int x,y;
}op[N]; 
int get(int a){
	if(fa[a]==a)return a;
	return fa[a]=get(fa[a]);
}
void add(int x,int y){
	++tot;to[tot]=y;ne[tot]=h[x];h[x]=tot;
}
void bfs(){
	memset(d,0x3f,sizeof d);
	queue<int> q;q.push(root);d[root]=1;d[0]=0;
	while(q.size()){
		int u=q.front();q.pop();
		for(int i=h[u];i;i=ne[i]){
			int y=to[i];
			if(d[y]>d[u]+1){
				d[y]=d[u]+1;
				q.push(y);
				f[y][0]=u;
				for(int i=1;i<=31;i++){
					f[y][i]=f[f[y][i-1]][i-1];
				}
			}
		}
	}
}
int lca(int a,int b){
    if (d[a]<d[b])swap(a,b);
    for (int k=31;k>=0;k--)
        if(d[f[a][k]]>=d[b])
            a=f[a][k];
    if(a==b)return a;
    for (int k=31;k>=0;k--)
        if (f[a][k]!=f[b][k]){
            a=f[a][k];
            b=f[b][k];
        }
    return f[a][0];
}
void dfs(int u){
    vis[u]=true;
    for (int i=h[u];i;i=ne[i]){
        int j=to[i];
        pr[j]=i;
        if (vis[j])continue;
        dfs(j);
        sum[u]+=sum[j];
    }
}
void bbfs(int x,int y){
	memset(st,false,sizeof st);
	memset(pr,-1,sizeof pr);
	queue<int> q;q.push(y);st[y]=true;
	while(q.size()){
		int u=q.front();q.pop();
		if(u==x){
			vector<int> v;
			int t=x,res=1;
			while(t!=-1&&t!=y){
				v.push_back(t);
				//cout<<t;
				t=pr[t];res++;
			}v.push_back(y);
			cout<<res<<endl;
			for(int i=0;i<v.size();i++)cout<<v[i]<<' ';
			cout<<endl;
			return ;
		}
		for(int i=h[u];i;i=ne[i]){
			int j=to[i];
			if(st[j])continue;
			st[j]=true;
			q.push(j);pr[j]=u;
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&a[i].x,&a[i].y);a[i].w=1;
	}
	root=a[1].x;
	for(int i=1;i<=m;i++){
		int x=get(a[i].x),y=get(a[i].y);
		if(x==y)continue;
		add(a[i].x,a[i].y);add(a[i].y,a[i].x);
		fa[x]=y;
	}
	int q;cin>>q;
	bfs();
	int uuu=0;
	for(int i=1;i<=q;i++){
		scanf("%d%d",&op[i].x,&op[i].y);
		int x=op[i].x,y=op[i].y;
		if(!sw[x])uuu++;if(!sw[y])uuu++;
		sw[x]=true;sw[y]=true;
		int p=lca(x,y);
		sum[p]-=2;
		sum[x]++;sum[y]++;
	}
	dfs(root);
	for(int i=1;i<=n;i++){
		if(sum[i]%2!=0)ans++;
	}
	if(ans==0){
		cout<<"YES"<<endl;
		for(int i=1;i<=q;i++){
			int x=op[i].x,y=op[i].y;
			bbfs(x,y);
		}
	}else {
		cout<<"NO"<<endl;
		cout<<min(uuu-ans,ans)<<endl;
	}
}```
2021/11/7 23:29
加载中...