题目大意:一种环能打开和闭合。现在有n(1<=n<=15)个编号为1~n的环错综复杂的连接着,要打开一些环重新连接使这n个环能构成一条链,问最少需要打开几次环可达到目的?

题目分析:用二进制数表示要打开的环的集合,总共2^n种情形,枚举每一种情况。当把将要打开的环打开后,此环是孤立的,接下来就要判断剩下的环还与几个环连着,如果有的环仍然与两个以上的环连着则该方案不可行,不可能构成链;然后判断剩下的环有没有连成一个圈,如果有,则该方案不可行;最后,判断完前两个条件之后,所有的环都一定处于某条短链(长度小于等于n)中,只需判断一下短链的条数是否小于等于打开的环数加1,若不成立,则一定连不成一条链,若成立,则该方案可行。

代码如下:

# include<iostream>
# include<cstdio>
# include<set>
# include<cstring>
# include<algorithm>
using namespace std; int n,ans,st[15],s[15],vis[15]; int bitCount(int sta)
{
return sta==0?0:bitCount(sta>>1)+(sta&1);
} void dfs(int u,int pre)
{
for(int i=0;i<n;++i){
if(i!=pre&&s[u]&(1<<i)){
++vis[i];
if(vis[i]<2)
dfs(i,u);
}
}
} bool ok(int sta)
{
for(int i=0;i<n;++i)
s[i]=st[i]; ///打开环
for(int i=0;i<n;++i){
if(sta&(1<<i)){
s[i]=0;
for(int j=0;j<n;++j){
if(j!=i&&s[j]&(1<<i))
s[j]^=(1<<i);
}
}
} ///判度
for(int i=0;i<n;++i)
if(!(sta&(1<<i))&&bitCount(s[i])>2)
return false; ///判圈
int link=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;++i){
if(!vis[i]&&!(sta&(1<<i))){
++link;
++vis[i];
dfs(i,-1);
}
}
for(int i=0;i<n;++i)
if(vis[i]>=2)
return false; ///判链
if(link-1>bitCount(sta))
return false; return true;
} int main()
{
int a,b,cas=0;
while(scanf("%d",&n)&&n)
{
memset(st,0,sizeof(st));
while(scanf("%d%d",&a,&b))
{
if(a==-1&&b==-1)
break;
st[a-1]|=(1<<(b-1));
st[b-1]|=(1<<(a-1));
} ans=n;
int tot=1<<n;
for(int i=0;i<tot;++i)
if(ok(i))
ans=min(ans,bitCount(i)); printf("Set %d: Minimum links to open is %d\n",++cas,ans);
}
return 0;
}

  

最新文章

  1. zabbix安装unixODBC配置完之后报错
  2. Android两个页面之间的切换效果工具类
  3. 回车与换行 ---编码等相关讨论----由notepad++ 批量替换 引发的讨论,转义字符也是人为硬性规定的。
  4. 数据库 基础篇4(mysql语法---表)
  5. IOS-UITextField-全解
  6. PHP 下载导出中文名的文件的编码注意事项
  7. 大型网站技术架构介绍--squid
  8. oracle闪回使用以及删除存储过程恢复
  9. java 抽象类和接口
  10. 【转】C++ function、bind以及lamda表达式
  11. Java中读取文件
  12. smarty模版使用php标签,获取模版变量!
  13. Android Studio中.9.png文件出错问题
  14. 基于Redis的分布式锁到底安全吗
  15. L1&amp;L2 Regularization的原理
  16. Java的接口和抽象类
  17. Windows Server 2012 R2部署--安装桌面体验
  18. lintcode-445-余弦相似度
  19. 查看apk包名和Activity名
  20. 解决SVN UUID客户端和服务器不一致的问题

热门文章

  1. Python Web学习笔记之SOCK_STREAM和SOCK_DGRAM
  2. swagger报错No handler found for GET /swagger-ui.html
  3. java service wrapper日志参数设置及优化
  4. map set iterator not incrementable 解决办法
  5. myeclipse中文名字项目运行报错
  6. C Looooops(扩展欧几里得)题解
  7. 2、extract-text-webpack-plugin提取Sass编译的Css
  8. Ambari安装指南
  9. UVa 147 Dollars(完全背包)
  10. 如何新建一个datatable,并往表里赋值