QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#421327 | #961. Smol Vertex Cover | qwqwf | WA | 0ms | 3900kb | C++14 | 3.0kb | 2024-05-25 16:36:24 | 2024-05-25 16:36:24 |
Judging History
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