日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

uva10160(dfs+状态压缩)

發(fā)布時間:2023/12/9 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uva10160(dfs+状态压缩) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意:給出n個點,以及m條邊,這些邊代表著這些點相連,修一個電力站,若在某一點修一個站,那么與這個點相連的點都可以通電,問所有的點都通電的話至少要修多少個電力站........

思路:最多給出的是35個點,那么若是搜索的話,就是2^35......考慮狀態(tài)壓縮剪枝,若某個點修電力站,那么周圍的所有點都有電了....

#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; }

?

總結(jié)

以上是生活随笔為你收集整理的uva10160(dfs+状态压缩)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。