這方法真好啊。。
有n個點,m條路,k個執照,每條路都屬於一些執照(擁有指定執照才能走)
求從0走到1 最少需要哪些執照
枚舉 1到1< 對每一種組合dfs 取二進制中1最少的解咯 代碼很簡潔 但熟練運用二進制總是需要多多練習的事。。 #include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f using namespace std; //mp[i][j]中為1的位表示,擁有該位的執照就可以走i到j這條路 int mp[35][35],vis[35],k,n,m,tmp,ans1[35],ans,tmp1[35]; void dfs(int x,int now) { vis[x]=1; if(x==1) return; for(int i=0;i>=1; } if(cnt>=ans) continue; now=i; memset(vis,0,sizeof vis); dfs(0,now); // printf("vis1:%d i:%d\n",vis[1],i); if(vis[1])//能夠走到1 則比較執照數量 { ans=0;cnt=0; while(now) { // printf("tmp:%d cnt:%d\n",tmp,cnt); if(now&1) { ans1[ans]=cnt; ans++; } now>>=1; cnt++; } } } printf("%d\n",ans); for(i=0;i
對每一種組合dfs 取二進制中1最少的解咯
代碼很簡潔 但熟練運用二進制總是需要多多練習的事。。
#include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f using namespace std; //mp[i][j]中為1的位表示,擁有該位的執照就可以走i到j這條路 int mp[35][35],vis[35],k,n,m,tmp,ans1[35],ans,tmp1[35]; void dfs(int x,int now) { vis[x]=1; if(x==1) return; for(int i=0;i>=1; } if(cnt>=ans) continue; now=i; memset(vis,0,sizeof vis); dfs(0,now); // printf("vis1:%d i:%d\n",vis[1],i); if(vis[1])//能夠走到1 則比較執照數量 { ans=0;cnt=0; while(now) { // printf("tmp:%d cnt:%d\n",tmp,cnt); if(now&1) { ans1[ans]=cnt; ans++; } now>>=1; cnt++; } } } printf("%d\n",ans); for(i=0;i
接口繼承中一個常見問題的思考 以前在設計DirectU
[cpp] #include<ios
調整數組順序使奇數位於偶數前面,數組偶數題目:輸入一個整數數
C++ MFC打開文件的流程,mfc打開文件流程打開文件的
給定有n個要相乘
一套跨平台五子棋網游的開發經歷,一套五子棋 &n