uva10160(dfs+状态压缩)
生活随笔
收集整理的這篇文章主要介紹了
uva10160(dfs+状态压缩)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:給出n個點,以及m條邊,這些邊代表著這些點相連,修一個電力站,若在某一點修一個站,那么與這個點相連的點都可以通電,問所有的點都通電的話至少要修多少個電力站........
思路:最多給出的是35個點,那么若是搜索的話,就是2^35......考慮狀態壓縮剪枝,若某個點修電力站,那么周圍的所有點都有電了....
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; typedef long long ss; ss sa[40],t[40],p=1; int dfs(ss n,ss step,ss ans,ss ks,ss m) {if(ans==((p<<n)-1)){return 1;}//printf("%I64d\n",ans);if(step==m)return 0;if(ks>n)return 0;for(int i=ks;i<=n;i++){//printf("%I64d %I64d\n",ans|t[i],((p<<n)-1));if((ans|t[i])!=((p<<n)-1))break;if((ans|sa[i])==ans)continue;if(dfs(n,step+1,ans|sa[i],i+1,m))return 1;}return 0; } int main() {ss n,q;//scanf("%I64d",&n);//scanf("%I64d",&q);//printf("%I64d %I64d\n",n,q);//printf("")while(scanf("%lld",&n)>0){scanf("%lld",&q);if(n==0&&q==0)break;for(ss i=1;i<=n;i++){sa[i]=p<<(i-1);}for(ss i=1;i<=q;i++){ss tmp,tmp1;scanf("%lld %lld",&tmp,&tmp1);sa[tmp]|=(p<<(tmp1-1));sa[tmp1]|=(p<<(tmp-1));}t[n]=sa[n];for(ss i=n-1;i>0;i--){t[i]=sa[i];t[i]|=t[i+1];}for(ss i=1;i<=n;i++){if(dfs(n,0,0,1,i)){printf("%lld\n",i);break;}}//printf("1111\n");}return 0; }
思路:最多給出的是35個點,那么若是搜索的話,就是2^35......考慮狀態壓縮剪枝,若某個點修電力站,那么周圍的所有點都有電了....
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; typedef long long ss; ss sa[40],t[40],p=1; int dfs(ss n,ss step,ss ans,ss ks,ss m) {if(ans==((p<<n)-1)){return 1;}//printf("%I64d\n",ans);if(step==m)return 0;if(ks>n)return 0;for(int i=ks;i<=n;i++){//printf("%I64d %I64d\n",ans|t[i],((p<<n)-1));if((ans|t[i])!=((p<<n)-1))break;if((ans|sa[i])==ans)continue;if(dfs(n,step+1,ans|sa[i],i+1,m))return 1;}return 0; } int main() {ss n,q;//scanf("%I64d",&n);//scanf("%I64d",&q);//printf("%I64d %I64d\n",n,q);//printf("")while(scanf("%lld",&n)>0){scanf("%lld",&q);if(n==0&&q==0)break;for(ss i=1;i<=n;i++){sa[i]=p<<(i-1);}for(ss i=1;i<=q;i++){ss tmp,tmp1;scanf("%lld %lld",&tmp,&tmp1);sa[tmp]|=(p<<(tmp1-1));sa[tmp1]|=(p<<(tmp-1));}t[n]=sa[n];for(ss i=n-1;i>0;i--){t[i]=sa[i];t[i]|=t[i+1];}for(ss i=1;i<=n;i++){if(dfs(n,0,0,1,i)){printf("%lld\n",i);break;}}//printf("1111\n");}return 0; }
?
總結
以上是生活随笔為你收集整理的uva10160(dfs+状态压缩)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 7 如何关闭已打开的应用(App
- 下一篇: 零基础自学SQL课程 | SQL中的日期