WA on 5求条
查看原帖
WA on 5求条
714592
封禁用户楼主2024/8/2 08:29

checker说Wrong Answer.wrong answer in 159-th test: Jury found answer, participant didn't.

#include<bits/stdc++.h>
#define int long long
#define N 500000
using namespace std;
int t,u1,n,m,top,cnt,cntu,s[N+5],d[N+5],fst[N+5],fa[N+5],dep[N+5],ans[N+5],pre[N+5];
bool vis[N+5];
vector<int>g[N+5];
queue<int>q;
void clear(){
	cnt=cntu=u1=0;
	while(!q.empty())q.pop();
	for(int i=1;i<=n;i++)g[i].clear();
}
void clearv(){
	for(int i=1;i<=n;i++)vis[i]=0;
}
void bfs(){
	clearv();
	vis[u1]=1;
	pre[u1]=0;
	q.push(u1);
	int v1=0;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		if(d[u]==1&&u!=u1){
			v1=u;
			break;
		}
		for(int v:g[u]){
			if(!vis[v]){
				vis[v]=1;
				pre[v]=u;
				q.push(v);
			}
		}
	}
	for(int i=v1;i;i=pre[i])ans[++cnt]=i;
}
void dfs1(int u,int f){
	vis[u]=1;
	fa[u]=f;
	dep[u]=dep[f]+1;
	for(int v:g[u])if(!vis[v]&&d[v]==2)dfs1(v,u);
}
void dfs2(int u){
	vis[u]=1;
	for(int v:g[u]){
		if(!vis[v]){
			if(d[v]==1)fst[++cntu]=u;
			if(d[v]==2)dfs2(v);
		}
	}
}
void dfs3(int u,int f){
	s[++top]=u;
	if(u==fst[2])for(int i=1;i<=top;i++)ans[++cnt]=s[i];
	for(int v:g[u])if(v!=f&&d[v]==2)dfs3(v,u);
	top--;
}
bool check0(){
	for(int i=1;i<=n;i++){
		if(!d[i]){
			ans[++cnt]=i;
			return 1;
		}
	}
	return 0;
}
bool check1(){
	for(int i=1;i<=n;i++)if(d[i]==1)u1=i;
	bfs();
	return cnt;
}
bool check2(){
	clearv();
	for(int i=1;i<=n;i++)if(!vis[i]&&d[i]==2)dfs1(i,0);
	int minc=n;
	for(int i=1;i<=n;i++)
		if(d[i]==2)
			for(int j:g[i])
				if(d[j]==2&&dep[i]-dep[j]>1)
					minc=min(minc,dep[i]-dep[j]);
	for(int i=1;i<=n;i++)
		if(d[i]==2)
			for(int j:g[i])
				if(d[j]==2&&dep[i]-dep[j]==minc){
					for(int k=i;k!=j;k=fa[k])ans[++cnt]=k;
					ans[++cnt]=j;
				}
	return cnt;
}
bool check12(){
	clearv();
	int cnt2=0;
	for(int i=1;i<=n;i++){
		if(d[i]==2&&!vis[i]){
			dfs2(i);
			dfs3(fst[1],0);
			cntu=0;
			cnt2++;
			if(cnt2==2)break;
		}
	}
	ans[++cnt]=u1;
	return cnt;
}
void print(){
	if(cnt==n)cout<<"No";
	else{
		cout<<"Yes\n"<<n-cnt<<'\n';
		clearv();
		for(int i=1;i<=cnt;i++)vis[ans[i]]=1;
		for(int i=1;i<=n;i++)if(!vis[i])cout<<i<<' ';
	}
	cout<<'\n';
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>t;
	while(t--){
		cin>>n>>m;
		clear();
		for(int i=1;i<=m;i++){
			int u,v;
			cin>>u>>v;
			g[u].push_back(v),g[v].push_back(u);
		}
		for(int i=1;i<=n;i++)d[i]=g[i].size()%3;
		if(check0()||check1()||check2()||check12())print();
	}
}
2024/8/2 08:29
加载中...