QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#33129 | #961. Smol Vertex Cover | Wu_Ren | TL | 0ms | 0kb | C++17 | 2.4kb | 2022-05-28 09:30:28 | 2022-05-28 09:30:29 |
Judging History
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