QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#33129#961. Smol Vertex CoverWu_RenTL 0ms0kbC++172.4kb2022-05-28 09:30:282022-05-28 09:30:29

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-05-28 09:30:29]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [2022-05-28 09:30:28]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
int n,m,q[510],l,r,h[510],fa[510],pre[510],c[510],fl[510];
int cnt=0;
vector<int>E[510],ans;
int find(int x){
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
int lca(int u,int v){
	for(cnt++;fl[u]^cnt;swap(u,v)) if(u) fl[u]=cnt,u=find(pre[h[u]]);
	return u;
}
void blo(int u,int v,int rt){
	for(;find(u)^rt;u=pre[v]){
		pre[u]=v,fa[u]=fa[v=h[u]]=rt;
		if(c[v]==1) c[q[++r]=v]=2;
	}
}
bool bfs(int u){
	iota(fa+1,fa+1+n,1),fill(c+1,c+1+n,0);
	for(c[q[l=r=1]=u]=2;l<=r;u=q[++l]) for(int v:E[u]){
		if(!c[v]){
			pre[v]=u,c[v]=1,c[q[++r]=h[v]]=2;
			if(!h[v]){
				for(;u;v=u) u=h[pre[v]],h[h[v]=pre[v]]=v;
				return 1;
			}
		}
		else if(c[v]==2){
			int l=lca(u,v);
			blo(u,v,l),blo(v,u,l);
		}
	}
	return 0;
}
bool vis[510],in[1010];
int head[1010],o,low[1010],dfn[1010],x=0,st[1010],t=0,bel[1010],scc;
struct edge{
	int to,link;
}e[300000];
void add_edge(int u,int v){
	e[++o]={v,head[u]},head[u]=o;
}
void dfs(int u){
	dfn[u]=low[u]=++x,in[u]=1,st[++t]=u;
	for(int i=head[u],v;i;i=e[i].link){
		if(!dfn[v=e[i].to]) dfs(v),low[u]=min(low[u],low[v]);
		else if(in[v]) low[u]=min(low[u],dfn[v]);
	}
	if(low[u]==dfn[u]){
		++scc;
		do{
			bel[st[t]]=scc;
			in[st[t]]=0;
		}while(st[t--]!=u);
	}
}
bool chk(){
	ans.clear();
	for(int i=2;i<=2*n+1;i++) head[i]=dfn[i]=in[i]=0;
	o=x=scc=0;
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			if(!h[i]) add_edge(i<<1,i<<1|1);
			else if(!vis[h[i]]){
				add_edge(h[i]<<1,i<<1|1);
			}
			for(int v:E[i]) if(!vis[v]){
				add_edge(v<<1|1,i<<1);
			}
		}
		else ans.push_back(i);
	}
	for(int i=2;i<=2*n+1;i++) if(!dfn[i]) dfs(i);
	for(int i=1;i<=n;i++) if(!vis[i]&&bel[i<<1]==bel[i<<1|1]) return 0;
	for(int i=1;i<=n;i++) if(!vis[i]&&bel[i<<1]<bel[i<<1|1]) ans.push_back(i);
	return 1;
}
void out(){
	for(int i:ans) printf("%d ",i);puts("");
}
void sol(){
	scanf("%d%d",&n,&m),cnt=0;
	for(int i=1;i<=n;i++) E[i].clear();
	for(int i=1,u,v;i<=m;i++) scanf("%d%d",&u,&v),E[u].push_back(v),E[v].push_back(u);
	int M=0;
	fill(h+1,h+n+1,0);
	for(int i=1;i<=n;i++) if(!h[i]&&bfs(i)) M++;
	if(chk()) assert(M==ans.size()),printf("%d\n",M),out();
	else{
		bool fl=0;
		for(int i=1;i<=n&&!fl;i++){
			vis[i]=1;
			if(chk()){
				assert(M+1==ans.size());
				printf("%d\n",M+1),out();
				fl=1;
			}
			vis[i]=0;
		}
		if(!fl) puts("not smol");
	}
}
int main(){
	int T; 
	scanf("%d",&T);
	while(T--) sol();
} 

詳細信息

Test #1:

score: 0
Time Limit Exceeded

input:

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

output:


result: