0表示分到0集合
1表示分到1集合
那么一个点度数位偶数的时候 那么 它所有的出边的异或和为 1
奇数的 时候 它的出边的异或和它相同
我们列出方程组直接求解即可
#include <bits/stdc++.h>
using namespace std;
const int maxn = 105;
int n, a[maxn][maxn];
int m;
int gauss() {
int r, c;
for(r = c = 0; c < n; c++) {
int t = r;
for(int i = r; i < n; i++) {
if(a[i][c]) {
t = i;
break;
}
}
if(!a[t][c]) continue;
for(int i = c; i <= n; i++) swap(a[t][i], a[r][i]);
for(int i = r + 1; i < n; i++) {
if(a[i][c]) {
for(int j = c; j <= n; j++) a[i][j] ^= a[r][j];
}
}
r++;
}
if(r < n) {
for(int i = r; i < n; i++) {
if(a[i][n]) return 2;
}
}
/*for(int i = n - 1; i >= 0; i--) {
for(int j = i + 1; j < n; j++) {
a[i][n] ^= a[i][j] & a[j][n];
}
}*/
return 0;
}
int d[maxn];
int g[maxn][maxn];
int main() {
cin >> n >> m;
for(int i = 1; i <= m; i++) {
int a, b;
cin >> a >> b;
d[a]++;
d[b]++;
g[a][b] = 1;
g[b][a] = 1;
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) {
if(g[i][j])a[i - 1][j - 1] = 1;
if(d[i] & 1) {
a[i - 1][n] = 0;
a[i - 1][i - 1] = 1;
} else {
a[i - 1][n] = 1;
}
}
if(!gauss()) {
cout << "Y" << endl;
} else {
cout << "N" << endl;
}
return 0;
}