http://acm.pku.edu.cn/JudgeOnline/problem?id=1081
Код:
#include <cstdio> #include <iostream> #include <algorithm> #define MAXN 30 using namespace std; char graph[MAXN+1][MAXN+1]; int cnt[2]; int n,m; int sign(int x) { if(x==0) { return 0; } else { return 1; } } int main() { int i,j,k,s,minimum; n=0; while(scanf("%d",&i)!=EOF) { scanf("%d",&m); for(k=0;k<m;k++) { scanf("%d",&j); graph[i][j]=graph[j][i]=1; } n=max(n,i); } minimum=1000000000; for(i=(1<<n)-1;i>=0;i--) { m=cnt[0]=cnt[1]=0; for(j=0;j<n;j++) { s=sign(i&(1<<j)); if(s!=0) { m++; } for(k=0;k<n;k++) { if((k!=j)&&(graph[k][j]==0)&&(s==sign(i&(1<<k)))) { cnt[s]++; break; } } } if(m==(n>>1)) { minimum=min(minimum,min(cnt[0],cnt[1])); } } printf("%d\n",minimum); return 0; }