QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#421603#961. Smol Vertex Cover_yjhRE 112ms4268kbC++145.3kb2024-05-25 22:13:312024-05-25 22:13:32

Judging History

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

  • [2024-05-25 22:13:32]
  • 评测
  • 测评结果:RE
  • 用时:112ms
  • 内存:4268kb
  • [2024-05-25 22:13:31]
  • 提交

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;
}

详细

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...

output:


result: