1. 程式人生 > >【WorldFinal 2012E】Infiltration(dfs+圖論)

【WorldFinal 2012E】Infiltration(dfs+圖論)

bitset des 最小 nal pri 搜索 include 級別 clas

Description

題意:給定一個點數為n的競賽圖,求圖的最小支配集

n<=75

Solution

如果將競賽圖的一個點刪去,這個圖還是競賽圖

而競賽圖每個點相連的邊數為(n-1),那麽刪去一個點後這個圖變成原圖一半大小的競賽圖

由此可知競賽圖的最小支配集是log(n)級別的

那麽答案最大為6,爆搜即可

Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <bitset>
using namespace std;

bitset<99> g[99
],tmp; int cas,n,path[9],Ans; bool dfs(int k,int p,bitset<99> cur){ if(k>=Ans) return (cur.count()==n);//支配所有點 for(int i=p;i<=n;++i) if(dfs(k+1,(path[k+1]=i),cur|g[i])) return 1; return 0; } int main(){ while(~scanf("%d",&n)){ for(int i=1;i<=n;++i) for
(int j=1;j<=n;++j){ char ch=getchar();while(ch!='0'&&ch!='1')ch=getchar(); g[i][j]=ch-'0'; if(i==j)g[i][j]=1;//包括自己這個點 } for(Ans=1;Ans<=10;Ans++) if(dfs(0,1,tmp))break;//叠代加深搜索 printf("Case %d:
%d ",++cas,Ans); for(int i=1;i<=Ans;++i) printf("%d ",path[i]); printf("\n"); for(int i=1;i<=n;++i) g[i]=tmp;//初始化 } return 0; }

【WorldFinal 2012E】Infiltration(dfs+圖論)