杂题专项:UVa 818

来源:互联网 发布:绝地求生辅助网站源码 编辑:程序博客网 时间:2024/05/22 15:48

这题太抽了,完全看不懂题目。模仿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;}


原创粉丝点击