QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#421603 | #961. Smol Vertex Cover | _yjh | RE | 112ms | 4268kb | C++14 | 5.3kb | 2024-05-25 22:13:31 | 2024-05-25 22:13:32 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef unsigned int uint;
inline ll read() {
ll x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=505;
namespace Match { //贺的
int tot,tag[N],vis[N],ma[N],pre[N],f[N],n,m,ans;
vector<int> v[N];queue<int> q;
void init(int N,int M) {
n=N,m=M;ans=0;
for(int i=1;i<=n;i++) tag[i]=vis[i]=ma[i]=pre[i]=f[i]=0,v[i].clear();
while(!q.empty()) q.pop();
}
void addedge(int x,int y) {
v[x].push_back(y);v[y].push_back(x);
}
int find(int x) {
while(x!=f[x]) x=f[x]=f[f[x]];
return x;
}
int lca(int x,int y) {
++tot;
while(true) {
if(x) {
x=find(x);
if(tag[x]==tot) return x;
tag[x]=tot;x=pre[ma[x]];
}
swap(x,y);
}
}
void flower(int x,int y,int p) {
while(find(x)!=p) {
pre[x]=y;y=ma[x];vis[y]=1;q.push(y);
if(find(x)==x) f[x]=p;
if(find(y)==y) f[y]=p;
x=pre[y];
}
}
void bfs(int st) {
for(int i=1;i<=n;++i) pre[i]=vis[i]=0,f[i]=i;
while(!q.empty()) q.pop();
vis[st]=1;q.push(st);
while(!q.empty()) {
int x=q.front();q.pop();
for(int y:v[x])
if(find(y)!=find(x)&&vis[y]!=2) {
if(vis[y]==1) {
int l=lca(x,y);
flower(x,y,l);flower(y,x,l);continue;
}
vis[y]=2; pre[y]=x;
if(!ma[y]) {
int px=y;
while(px) {
int py=pre[px],pz=ma[py];
ma[px]=py;ma[py]=px;px=pz;
}
++ans;return;
}
vis[ma[y]]=1;q.push(ma[y]);
}
}
}
vector <array<int,2>> solve() {
vector <array<int,2>> ret;
for(int i=1;i<=n;i++) if(!ma[i]) bfs(i);
for(int i=1;i<=n;i++) if(ma[i]>i) ret.push_back({i,ma[i]});
return ret;
}
}
namespace SAT {
int n,cnt,sit[N][2],dfn[N<<1],isk[N<<1],low[N<<1],dnf,fm[N<<1],id;
vector <int> v[N];
stack <int> s;
void init(int N) {
n=N;cnt=0;
for(int i=1;i<=n;i++) sit[i][0]=++cnt,sit[i][1]=++cnt;
for(int i=1;i<=cnt;i++) v[i].clear(),low[i]=isk[i]=dfn[i]=fm[i]=0;
while(!s.empty()) s.pop();dnf=id=0;
}
void addedge(array <int,2> s,array <int,2> t) {
auto [a,b]=s;auto [c,d]=t;
v[sit[a][b]].push_back({sit[c][d]});
v[sit[c][d^1]].push_back({sit[a][b^1]});
}
void tarjan(int x) {
dfn[x]=low[x]=++dnf;
s.push(x);isk[x]=true;
for(int to:v[x]) {
if(!dfn[to]) {
tarjan(to);
low[x]=min(low[x],low[to]);
}
else if(isk[to]) {
low[x]=min(low[x],dfn[to]);
}
}
if(dfn[x]==low[x]) {
++id;
while(s.top()!=x) {
fm[s.top()]=id,isk[s.top()]=false;
s.pop();
}
fm[s.top()]=id,isk[s.top()]=false;
s.pop();
}
}
bool check() {
for(int i=1;i<=cnt;i++) if(!dfn[i]) tarjan(i);
for(int i=1;i<=n;i++) if(fm[sit[i][0]]==fm[sit[i][1]]) return false;
return true;
}
void print() {
for(int i=1;i<n;i++) if(fm[sit[i][1]]<fm[sit[i][0]]) cout<<i<<' ';
cout<<'\n';
}
}
int n,m;
bool vis[N],tag[N];
struct edge {
int x,y;
}e[N*N];
vector <int> v[N];
map <array<int,2>,bool> mp;
void clear() {
mp.clear();
for(int i=1;i<=n;i++) v[i].clear(),vis[i]=tag[i]=false;
}
bool check() {
SAT::init(n+1);
for(int i=1;i<=n;i++) {
if(tag[i]) {
SAT::addedge({i,0},{i,1});
}
}
for(int i=1;i<=m;i++) {
auto [x,y]=e[i];
if(vis[x]&&vis[y]) {
SAT::addedge({x,0},{y,1});
SAT::addedge({y,0},{x,1});
if(mp[{x,y}]&&!tag[x]&&!tag[y]) {
SAT::addedge({x,1},{y,0});
SAT::addedge({y,1},{x,0});
}
}
else if(vis[x]) {
SAT::addedge({x,0},{n+1,0});
SAT::addedge({x,0},{n+1,1});
}
else if(vis[y]) {
SAT::addedge({y,0},{n+1,0});
SAT::addedge({y,0},{n+1,1});
}
else return false;
}
return SAT::check();
}
void mian() {
n=read(),m=read();clear();
Match::init(n,m);
for(int i=1;i<=m;i++) {
int x=read(),y=read();
v[x].push_back(y),v[y].push_back(x);
Match::addedge(x,y);
e[i]={x,y};
}
auto mt=Match::solve();
for(auto [u,v]:mt) {
vis[u]=vis[v]=true;
mp[{u,v}]=mp[{v,u}]=true;
}
if(check()) {
cout<<mt.size()<<'\n';
SAT::print();
return ;
}
for(int i=1;i<=n;i++) {
if(vis[i]) {
tag[i]=true;
if(check()) {
cout<<mt.size()+1<<'\n';
SAT::print();
return ;
}
tag[i]=false;
continue;
}
vis[i]=true;
if(check()) {
cout<<mt.size()+1<<'\n';
SAT::print();
return ;
}
vis[i]=false;
}
cout<<"not smol\n";
}
int main() {
mian();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3932kb
input:
5 5 1 2 2 3 3 4 4 5 1 5
output:
3 1 2 4
result:
ok vertex cover of size 3
Test #2:
score: 0
Accepted
time: 0ms
memory: 3704kb
input:
5 10 1 2 1 3 1 4 1 5 2 3 2 4 2 5 3 4 3 5 4 5
output:
not smol
result:
ok not smol
Test #3:
score: 0
Accepted
time: 0ms
memory: 3904kb
input:
3 0
output:
0
result:
ok vertex cover of size 0
Test #4:
score: 0
Accepted
time: 0ms
memory: 3604kb
input:
10 10 2 5 3 8 3 10 6 9 1 4 2 6 2 3 4 6 7 10 4 7
output:
5 3 4 5 6 7
result:
ok vertex cover of size 5
Test #5:
score: 0
Accepted
time: 0ms
memory: 3868kb
input:
10 20 1 9 3 6 3 7 8 9 3 8 1 4 5 10 7 10 4 6 7 9 9 10 2 7 1 6 5 8 2 9 1 7 5 7 3 10 2 6 4 10
output:
6 1 6 7 8 9 10
result:
ok vertex cover of size 6
Test #6:
score: 0
Accepted
time: 1ms
memory: 3720kb
input:
50 100 29 49 1 43 12 49 31 46 6 42 25 29 27 37 2 39 3 43 34 43 4 38 2 40 9 14 7 20 22 31 9 42 3 31 36 49 23 33 17 18 34 47 20 36 11 24 5 17 6 29 21 22 5 41 19 28 31 37 8 47 8 42 8 28 1 48 31 41 6 32 14 36 32 42 27 47 1 40 6 30 26 49 9 44 12 22 30 46 9 11 11 28 18 32 13 15 17 44 16 29 17 42 4 21 17 2...
output:
not smol
result:
ok not smol
Test #7:
score: 0
Accepted
time: 0ms
memory: 3984kb
input:
50 300 18 29 25 33 13 27 22 38 43 50 9 47 36 43 15 33 33 36 23 39 17 46 28 35 40 49 24 26 15 30 39 43 9 48 2 4 7 20 13 21 35 40 2 46 12 22 17 33 9 49 17 32 15 28 24 32 7 38 12 32 18 37 13 30 4 24 5 22 6 17 4 26 3 13 5 29 27 34 1 12 16 22 3 14 1 21 22 27 20 49 9 34 18 36 40 42 21 33 44 45 2 49 13 37 ...
output:
not smol
result:
ok not smol
Test #8:
score: 0
Accepted
time: 3ms
memory: 3880kb
input:
50 1000 3 35 32 34 2 24 3 10 15 34 9 45 16 24 7 10 15 39 38 40 17 45 21 35 18 36 15 50 22 29 34 40 3 36 43 50 17 19 7 30 27 44 12 48 9 18 14 20 16 30 1 34 20 35 19 33 2 27 13 20 19 32 38 48 27 37 4 28 5 45 6 43 1 36 9 13 4 18 14 32 10 38 3 44 8 47 6 41 18 38 13 40 18 28 40 47 15 18 42 48 15 47 31 36...
output:
not smol
result:
ok not smol
Test #9:
score: 0
Accepted
time: 3ms
memory: 3764kb
input:
200 300 64 134 92 154 82 142 33 198 26 185 24 74 32 144 26 118 113 122 98 130 74 84 70 184 45 181 44 136 44 134 67 185 77 160 21 50 80 181 62 78 196 199 37 174 91 105 17 74 158 166 26 172 70 129 128 133 152 173 15 86 37 67 55 91 45 74 60 141 179 184 22 168 65 161 62 67 117 152 174 181 35 99 80 103 3...
output:
not smol
result:
ok not smol
Test #10:
score: 0
Accepted
time: 13ms
memory: 4112kb
input:
200 1000 19 159 64 180 15 88 82 136 22 57 92 200 86 87 176 194 57 106 116 179 101 128 27 137 41 71 35 139 48 153 177 178 80 131 9 156 29 122 101 148 88 163 90 116 16 72 8 166 100 116 97 161 19 143 78 163 23 119 104 146 91 161 52 66 183 196 29 123 84 86 41 109 65 76 82 161 138 182 108 156 35 94 101 1...
output:
not smol
result:
ok not smol
Test #11:
score: 0
Accepted
time: 112ms
memory: 4268kb
input:
200 5000 60 81 22 145 156 181 27 44 49 89 69 176 61 64 16 199 46 50 75 103 26 168 6 35 60 75 51 117 41 105 20 154 69 100 75 195 22 115 67 72 170 190 31 115 10 200 51 129 14 147 161 163 9 72 22 113 70 87 112 184 28 81 178 197 72 180 171 192 71 116 71 174 30 95 20 157 50 125 142 184 18 130 82 110 65 1...
output:
not smol
result:
ok not smol
Test #12:
score: -100
Runtime Error
input:
500 300 201 309 17 37 39 176 416 493 86 475 163 215 127 283 122 274 107 412 7 93 294 434 335 360 50 87 364 372 55 192 341 411 236 299 286 349 79 208 137 470 141 421 21 324 4 165 232 473 367 397 400 475 30 77 177 435 116 133 115 281 416 482 198 498 300 410 173 457 176 450 157 179 402 425 219 486 39 3...