练手CF3-C - Wormhouse
生活随笔
收集整理的這篇文章主要介紹了
练手CF3-C - Wormhouse
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
深搜,亮點在那個剪枝,flag代表是否搜索數組從開始到當前一直等于原始數組同位置的數,如果是真,就從原始數組的當前位置的書開始搜,否則就從0開始搜。
見代碼。
?
#include <iostream> #include <cstring>using namespace std; int n,m,beg,origin[2003]; int mp[103][103]; bool vis[103][103]; int cnt; int stk[2010]; bool check() {int i;for(i=0;i<=m;i++){if(stk[i]==origin[i])continue;if(stk[i]<origin[i])return false;if(stk[i]>origin[i])return true;}return false; }void dfs(int bg,bool flag) { // cout<<cnt<<endl;if(cnt==m+1){ // for(int i=0;i<=m;i++) // cout<<stk[i]<<' '; // cout<<endl;if(stk[cnt-1]==beg&&check()){return;}else{return;}}for(int i=1;i<=n;i++){if(flag&&i<origin[cnt])continue;if(mp[bg][i]&&!vis[bg][i]){vis[bg][i]=true;vis[i][bg]=true;stk[cnt++]=i;dfs(i,flag&&i==origin[cnt-1]); // cout<<stk[cnt]<<endl;if(cnt==m+1&&stk[cnt-1]==beg&&check())return; // cout<<" "<<cnt<<endl;cnt--; // cout<<" "<<cnt<<endl;vis[bg][i]=false;vis[i][bg]=false;}}return; } int main() {cin>>n>>m;int i;cnt=1;memset(mp,0,sizeof(mp));memset(vis,false,sizeof(vis));cin>>origin[0];beg=origin[0];for(i=1;i<=m;i++){cin>>origin[i];mp[origin[i-1]][origin[i]]=1;mp[origin[i]][origin[i-1]]=1;}for(i=1;i<=n;i++) // { // for(int j=1;j<=n;j++) // cout<<mp[i][j]<<' '; // cout<<endl;}stk[0]=beg;dfs(beg,true); // cout<<cnt<<endl;if(cnt==m+1){for(i=0;i<=m;i++)cout<<stk[i]<<' ';cout<<endl;}elsecout<<"No solution"<<endl;return 0; }
轉載于:https://www.cnblogs.com/aljxy/p/3415684.html
總結
以上是生活随笔為你收集整理的练手CF3-C - Wormhouse的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 执行Cmd窗口中的命令 [复制
- 下一篇: yii2 发送邮件 yii\swiftm