QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#421327#961. Smol Vertex CoverqwqwfWA 0ms3900kbC++143.0kb2024-05-25 16:36:242024-05-25 16:36:24

Judging History

你现在查看的是最新测评结果

  • [2024-05-25 16:36:24]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3900kb
  • [2024-05-25 16:36:24]
  • 提交

answer

#include<bits/stdc++.h>
#define ll long long
//#define int ll
#define pb push_back
using namespace std;
const int N=1e3+10;
mt19937 rnd(time(0));
vector<int> e[N],G[N];
int n,m,id[N][2],cnt;
int match[N];
bool vis[N];
bool dfs(int u){
	shuffle(e[u].begin(),e[u].end(),rnd);vis[u]=1;
	for(int v:e[u]) if(!match[v]) return vis[v]=1,match[v]=u,match[u]=v,1;
	for(int v:e[u]){
		int t=match[v];if(vis[t]) continue;
		match[t]=0;match[u]=v,match[v]=u;
		if(dfs(t)) return 1;
		match[u]=0;match[t]=v,match[v]=t;
	}
	return 0;
}
int dfn[N],low[N],stk[N],scc[N],tp,col,dfc;
bool instk[N];
inline void init(){
	tp=col=dfc=0;
	for(int i=1;i<=cnt;i++) dfn[i]=low[i]=scc[i]=instk[i]=0;
}
void tarjan(int u){
	dfn[u]=low[u]=++dfc;
	stk[++tp]=u;instk[u]=1;
	for(int v:G[u]){
		if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
		else if(instk[v]) low[u]=min(low[u],dfn[v]);
	}
	if(low[u]==dfn[u]){
		++col;
		int v;
		do{
			v=stk[tp--];
			scc[v]=col;instk[v]=0; 
		}while(v!=u);
	}
}
inline bool chk(){
	for(int i=1;i<=n;i++) if(scc[id[i][0]]==scc[id[i][1]]) return 0;
	return 1;
}
void solve(){
	cin>>n>>m;
	cnt=0;
	for(int i=1;i<=n;i++) id[i][0]=++cnt,id[i][1]=++cnt,e[i].clear();
	for(int i=1,u,v;i<=m;i++){
		cin>>u>>v;
		e[u].pb(v);e[v].pb(u);
		G[id[u][0]].pb(id[v][1]); 
		G[id[v][0]].pb(id[u][1]); 
	}
	int tot=5,ans=0;
	for(int i=1;i<=n;i++) match[i]=0;
	while(tot--){
		for(int i=1;i<=n;i++) if(!match[i]) fill(vis+1,vis+n+1,0),ans+=dfs(i);
	}
//	for(int i=1;i<=n;i++) cout<<match[i]<<' ';cout<<'\n';
	for(int i=1;i<=n;i++) if(match[i]<i){
		int j=match[i];
		G[id[j][1]].pb(id[i][0]); 
		G[id[i][1]].pb(id[j][0]);
	}
	for(int i=1;i<=cnt;i++) G[i].clear();
	for(int u=1;u<=n;u++) for(int v:e[u]) G[id[u][0]].pb(id[v][1]); 
	for(int i=1;i<=n;i++) if(match[i]<i){
		int j=match[i];
		G[id[j][1]].pb(id[i][0]); 
		G[id[i][1]].pb(id[j][0]);
	}
	for(int i=1;i<=n;i++) if(!match[i]) G[id[i][1]].pb(id[i][0]); 
	init();
	for(int i=1;i<=cnt;i++) if(!dfn[i]) tarjan(i);
	if(chk()){
		cout<<ans<<'\n';
		for(int i=1;i<=n;i++){
			if(scc[id[i][0]]>scc[id[i][1]]) cout<<i<<' ';
		}cout<<'\n';
		return ;
	}
	for(int x=1;x<=n;x++){
		int y=match[x];
		for(int i=1;i<=cnt;i++) G[i].clear();
		for(int u=1;u<=n;u++) for(int v:e[u]) G[id[u][0]].pb(id[v][1]); 
		for(int i=1;i<=n;i++) if(match[i]<i){
			int j=match[i];
			if(i==x||j==x) continue; 
			G[id[j][1]].pb(id[i][0]); 
			G[id[i][1]].pb(id[j][0]);
		}
		G[id[x][0]].pb(id[x][1]);
		G[id[y][0]].pb(id[y][1]);
		for(int i=1;i<=n;i++) if(!match[i]&&i!=x) G[id[i][1]].pb(id[i][0]);
		init();
		for(int i=1;i<=cnt;i++) if(!dfn[i]) tarjan(i);
		if(chk()){
			cout<<ans+1<<'\n';
			for(int i=1;i<=n;i++){
				if(scc[id[i][0]]>scc[id[i][1]]) cout<<i<<' ';
			}cout<<'\n';
			return ;
		}
	}
	cout<<"not smol\n";
}
signed main(){
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int T;cin>>T;
	while(T--) solve();
	return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3900kb

input:

5 5
1 2
2 3
3 4
4 5
1 5

output:

1
2 
1

0

0

0


result:

wrong answer not a vertex cover