#include <bits/stdc++.h>
using namespace std;
int mat[36][37], n, m, ans = 2147483647;
int js[37];
int gcd (int a, int b){
return b ? gcd (b, a%b) : a;
}
int lcm (int a, int b){
return a * b / gcd (max(a,b), min(a,b));
}
void solve (){ //gauss
for (int row=1,col=1; row<=n; col++,row++){
int maxindex = row;
for (int i=row+1; i<=n; i++)
if (abs(mat[i][col]) > abs(mat[maxindex][col]))
maxindex = i;
if (maxindex != row)
for (int i=col; i<=n+1; i++)
swap (mat[row][i], mat[maxindex][i]);
if (mat[row][col] == 0){
row --;
continue;
}
for (int i=row+1; i<=n; i++){
if (mat[i][col] == 0) continue;
int LCM = lcm (abs(mat[row][col]), abs(mat[i][col]));
int against = mat[row][col] * mat[i][col] < 0 ? -1 : 1;
int p = LCM / abs(mat[i][col]), q = LCM / abs(mat[row][col]);
for (int j=col; j<=n+1; j++)
mat[i][j] = mat[i][j] * p - against * mat[row][j] * q;
}
}
return;
}
void dfs (int r){
if (r == 0){
int p = 0;
for (int i=1; i<=n; i++) p += js[i];
ans = min (ans, p);
return;
}
for (int i=r+1; i<=n; i++) mat[r][n+1] -= mat[r][i] * js[i];
if (abs(mat[r][r]) & 1){
if (abs(mat[r][n+1]) & 1) js[r] = 1;
else js[r] = 0;
dfs (r-1);
}
else{
if (abs(mat[r][n+1]) & 1) return;
js[r]=0;
dfs (r-1);
js[r]=1;
dfs (r-1);
}
return;
}
int main (){
scanf ("%d%d", &n, &m);
for (int i=1; i<=m; i++){
int a, b;
scanf ("%d%d", &a, &b);
mat[a][b] = mat[b][a] = 1;
}
for (int i=1; i<=n; i++) mat[i][i] = mat[i][n+1] = 1;
solve ();
dfs (n);
cout << ans;
return 0;
}
出了什么问题呢?麻烦指教一下