这题太抽了,完全看不懂题目。模仿UVa论坛上的思路勉强把这题过了,虽然后来有点懂了,但说起来着实费劲,就直接贴代码吧。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <sstream>
using namespace std;
int n;
string str;
int g[20][20];
int vis[20];
int bitcount(int x){return x==0?0:bitcount(x/2)+(x&1);}
int loop;
void dfs(int u,int st,int fa)
{
vis[u]=1;
for(int i=0;i<n;i++) if(!(st&(1<<i))&&i!=fa)
{
if(g[u][i]&&!vis[i]) dfs(i,st,u);
else if(g[u][i]&&vis[i]) loop=1;
}
}
int main()
{
int kase=1;
while(cin>>n&&n)
{
getline(cin,str);
istringstream in(str);
int u,v;
memset(g,0,sizeof(g));
while(in>>u>>v)
{
if(u<0&&v<0) break;
u--;v--;
g[u][v]=g[v][u]=1;
}
int ans=20;
for(int s=0;s<(1<<n);s++)
{
int flag=1;
for(int i=0;i<n;i++) if(!(s&(1<<i)))
{
int cnt=0;
for(int j=0;j<n;j++) if(!(s&(1<<j)))
{
if(g[i][j]) cnt++;
}
if(cnt>2) {flag=0;break;}
}
if(!flag) continue;
int cnt=0;
memset(vis,0,sizeof(vis));
loop=0;
for(int i=0;i<n;i++) if(!(s&(1<<i))&&!vis[i])
{
cnt++;
dfs(i,s,-1);
}
if(loop) continue;
//cout<<s<<" "<<cnt<<endl;
if(bitcount(s)>=cnt-1) ans=min(ans,bitcount(s));
}
cout<<"Set "<<kase++<<": Minimum links to open is "<<ans<<endl;
}
return 0;
}