我的做法是随便找一个三元环,把它丢到一个集合 S 里面去。然后枚举 u,v∈S,再枚举 x∈[1,n],满足 (u,x),(v,x)∈E,就把 x 丢到 S 里面去。如果所有元素都被丢到 S 里面去就是固定完了。
我觉得应该没假。
int G[205][205], vis[205], deg[205];
vector<int> V;
int n, m;
bool add() {
for(int i = 0; i < V.size(); i++) {
for(int j = 0; j < i; j++) {
int u = V[i], v = V[j];
for(int k = 1; k <= n; k++) {
if(vis[k]) continue;
if(G[u][k] + G[k][v] == 2) {
V.push_back(k);
vis[k] = 1;
return 1;
}
}
}
}
return 0;
}
int fake() {
n = read(), m = read();
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
G[i][j] = 0, deg[i] = 0, vis[i] = 0;
for(int i = 1; i <= m; i++) {
int u = read(), v = read();
G[u][v] = G[v][u] = 1;
deg[u]++;
deg[v]++;
}
if(n == 1) return puts("Yes");
for(int i = 1; i <= n; i++) if(deg[i] == 0) {
return puts("No");
}
if(n == 2) {
return puts("Yes");
}
int a1 = -1, a2 = -1, a3 = -1;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
for(int k = 1; k <= n; k++) {
if(G[i][j] + G[j][k] + G[k][i] == 3) {
a1 = i;
a2 = j;
a3 = k;
break;
}
}
if(a1 + a2 + a3 == -3) {
return puts("No");
}
V.clear();
V.push_back(a1);
V.push_back(a2);
V.push_back(a3);
vis[a1] = vis[a2] = vis[a3] = 1;
int cnt = 3;
while(add()) cnt++;
if(cnt < n) return puts("No");
puts("Yes");
return 0;
}