#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
//抄博友好程序 巧妙 背 dfs
int vis[70];
int jl[70];
int mp[70][70];
int n;
int jg;
int lone[70];
void check()
{
//cout<<"check"<<endl;
memset(vis,0,sizeof(vis));
memset(lone,0,sizeof(lone));
for(int i=0;i<(n/2);i++)
{
vis[jl[i]]=1;
}
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
if((vis[i]==vis[j])&&(mp[i][j]==0))
{
lone[i]++;
lone[j]++;
}
}
}
int tt=0;
for(int i=1;i<=n;i++)
{
//cout<<lone[i]<<endl;
tt=max(tt,lone[i]);
}
jg=min(jg,tt);
//cout<<"jg "<<jg<<endl;
}
void dfs(int t,int s)
{
//cout<<"dfs "<<t<<" "<<s<<endl;
if(t>n)
{
//cout<<"by0 "<<t<<" "<<n<<endl;
return;
}
if(s==(n/2))
{
check();
//cout<<"by1 "<<s<<" "<<n/2<<endl;
return;
}
jl[s]=t;
//cout<<" jl["<<s<<"]="<<t<<endl;
dfs(t+1,s+1);//巧妙
dfs(t+1,s);//巧妙
}
int main()
{
jg=10000;
memset(vis,0,sizeof(vis));
memset(jl,0,sizeof(jl));
memset(mp,0,sizeof(mp));
int a,tn,b;
n=0;
while(scanf("%d",&a)!=EOF)
{
n++;
scanf("%d",&tn);
for(int i=0;i<tn;i++)
{
scanf("%d",&b);
mp[a][b]=mp[b][a]=1;
}
}
//cout<<n<<endl;
/*
for(int i=1;i<10;i++)
{
for(int j=1;j<10;j++)
{
cout<<mp[i][j]<<" ";
}
cout<<endl;
}*/
dfs(1,0);
cout<<jg<<endl;
return 0;
}
POJ 1081 You Who? C++ dfs 巧妙 背
于 2017-04-28 21:16:35 首次发布