WAon#5求调
查看原帖
WAon#5求调
91433
czy0407楼主2024/8/3 20:32
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5e5+10;
int T,n,m,head[N],du[N],f[N],pre[N],cnt,sb,S,Ans[N];
struct Edge
{
	int nxt,v;	
}e[N<<1];
void add(int u,int v)
{
	e[++cnt].nxt=head[u];
	e[cnt].v=v;
	head[u]=cnt;
}
int bfs(int s)
{
	queue<int> q;
	q.push(s);f[s]=1;
	f[S]=1;pre[s]=0;
	while(!q.empty())
	{
		int u=q.front();q.pop();
		if(du[u]==1&&u!=s)return u;
		f[u]=1;
		for(int i=head[u];i;i=e[i].nxt)
		{
			int v=e[i].v;
			if(!f[v])
			{
				f[v]=1;
				q.push(v);
				pre[v]=u;
			}
		}
	}
	return 0;
}
int dfs(int u,int fa)
{
	if(f[u]==3)
	{
		sb=1;
		return u;
	}
	f[u]=3;
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(du[v]==2&&v!=fa)
		{
			pre[v]=u;
			int x=dfs(v,u);
			if(sb)return x;
		}
	}
	return 0;
}
int main()
{
//	freopen("Map.in","r",stdin);
//	freopen("Map.out","w",stdout);
	scanf("%d",&T);
	int x=0;
	while(T--)
	{
		cnt=sb=S=0;
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)head[i]=e[i].v=e[i].nxt=du[i]=pre[i]=f[i]=Ans[i]=0;	
		for(int i=1;i<=m;i++)
		{
			int u,v;
			scanf("%d%d",&u,&v);
			du[u]++;du[v]++;
			add(u,v);add(v,u);
		}
		int p=1;
		for(int i=1;i<=n;i++)
		{
			du[i]%=3;
			if(du[i]==0)
			{
				if(n==1)puts("No");
				else 
				{
					puts("Yes");
					printf("%d\n",n-1);
					for(int j=1;j<=n;j++)if(j!=i)printf("%d ",j);
					printf("\n");
				}
				p=0;break;
			}
		}
		if(p)
		for(int i=1;i<=n;i++)
		{
			if(du[i]==1)
			{
				for(int j=1;j<=n;j++)f[j]=0;
				int x=bfs(i);
				if(x)
				{
					int ans=0;
					for(int j=x;j;j=pre[j])f[j]=2;
					for(int j=1;j<=n;j++)if(f[j]!=2)ans++;
					if(ans==n||ans==0)cout<<"No\n";
					else
					{
						puts("Yes");
						printf("%d\n",ans);
						for(int j=1;j<=n;j++)if(f[j]!=2)printf("%d ",j);
						printf("\n");
					}
					p=0;break;
				}
			}
		}
		if(p)
		{
			for(int i=1;i<=n;i++)
			{
				if(du[i]==2)
				{
					for(int j=1;j<=n;j++)f[j]=0;
					int x=dfs(i,0);
					if(x)
					{
						int ans=1;
						f[x]=114514;
						for(int j=pre[x];j!=x&&j;j=pre[j])
						{
							ans++,f[j]=114514;
							
						}
						if(ans==n||ans==0)
						{
							puts("No");	
							p=0;break;	
						}
						puts("Yes");
						printf("%d\n",n-ans);
						for(int j=1;j<=n;j++)if(f[j]!=114514)printf("%d ",j);
						printf("\n");
						p=0;break;
					}
				}
			}	
		}
		if(p)
		{
			for(int i=1;i<=n;i++)f[i]=pre[i]=0;
			for(int i=1;i<=n;i++)
			{
				if(du[i]==1)
				{
					for(int j=head[i];j;j=e[j].nxt)du[e[j].v]--;
					f[i]=1;
					S=i;
					du[i]=0;pre[i]=0;Ans[1]=i;
					break;
				}
			}
			int ans=1;
			for(int i=1;i<=n;i++)
			{
				if(du[i]==1&&!f[i])
				{
					int x=bfs(i);
					for(int j=x;j;j=pre[j])Ans[++ans]=j;
				}
			}
			for(int i=1;i<=ans;i++)f[Ans[i]]=114514;
			ans=0;
			for(int i=1;i<=n;i++)if(f[i]!=114514)ans++;
			if(ans==n||ans==0)puts("No");
			else
			{
				puts("Yes");
				printf("%d\n",ans);
				for(int i=1;i<=n;i++)if(f[i]!=114514)printf("%d ",i);
				printf("\n");
			}
		}
	}
	return 0;
}
2024/8/3 20:32
加载中...