【WorldFinal 2012E】Infiltration(dfs+圖論)
阿新 • • 發佈:2018-03-03
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+圖論)