1. 程式人生 > 實用技巧 >dfs:哈密頓繞行世界問題(HDU-2181)

dfs:哈密頓繞行世界問題(HDU-2181)

哈密頓繞行世界問題(HDU-2181)

題解:一個規則的實心十二面體,它的 20個頂點標出世界著名的20個城市,你從一個城市出發經過每個城市剛好一次後回到出發的城市。

裸DFS;

程式碼:

#include<bits/stdc++.h>
using namespace std;
const int maxn=30;
const int mod=142857;
const int inf=0x3f3f3f3f;
typedef long long ll;
typedef pair<int,int> pii;
const int N=5e5+10;

int a[maxn][maxn];
int ans[maxn]; int vis[maxn]; int m,cnt; void dfs(int city,int step) { if(city==m&&step==20) { cout<<++cnt<<": "; for(int i=0; i<20; i++) cout<<ans[i]<<" "; cout<<m<<endl; return ; } ans[step]=city;
for(int i=1; i<=3; i++) { if(!vis[a[city][i]]) { vis[a[city][i]]=1; dfs(a[city][i],step+1); vis[a[city][i]]=0; } } } int main() { int x,y,z; for(int i=1; i<=20; i++) { cin>>x>>y>>z; a[i][
1]=x; a[i][2]=y; a[i][3]=z; sort(a[i],a[i]+3); } while(cin>>m&&m) { memset(vis,0,sizeof(vis)); memset(ans,0,sizeof(ans)); dfs(m,0); } system("pause"); return 0; }