HDOJ 2181 哈密顿绕行世界问题

来源:互联网 发布:qq卡屏源码 编辑:程序博客网 时间:2024/05/17 00:51

题意:已知有20个城市,有些城市之间有一条路,判断有多少种走法使得不经过同一个城市能回到起点

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181

思路:dfs+回溯,判断是否回到原点即可

注意点:无


以下为AC代码:

Run IDSubmit TimeJudge StatusPro.IDExe.TimeExe.MemoryCode Len.LanguageAuthor129707522015-02-20 22:34:38Accepted21810MS1632K2024 BG++luminous11

#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <vector>#include <deque>#include <list>#include <cctype>#include <algorithm>#include <climits>#include <queue>#include <stack>#include <cmath>#include <map>#include <set>#include <iomanip>#include <cstdlib>#include <ctime>#define ll long long#define ull unsigned long long#define all(x) (x).begin(), (x).end()#define clr(a, v) memset( a , v , sizeof(a) )#define pb push_back#define mp make_pair#define read(f) freopen(f, "r", stdin)#define write(f) freopen(f, "w", stdout)using namespace std;//const double pi = acos(-1);//const double eps = 1e-10;//const int dir[[4][2] = { 1,0, -1,0, 0,1, 0,-1 };vector<int> adj[25];int be;int cnt = 0;bool vis[25];int ans[25];bool init(){    int a;    clr ( ans, 0 );    clr ( vis, 0 );    for ( int i = 1; i <= 20; i ++ ){        adj[i].clear();        for ( int j = 0; j < 3; j ++ ){            cin >> a;            if ( a == 0 )return 0;            adj[i].pb ( a );        }        sort ( all ( adj[i] ) );    }    cin >> be;}void print( int len ){    cout << ++ cnt << ": ";    for ( int i = 0; i <= len; i ++ ){        cout << ' ' << ans[i];    }    cout << endl;}void dfs ( int x, int len ){    if ( len == 20 ){        for ( int i = 0; i < adj[x].size(); i ++ ){            if ( adj[x][i] == be ){                ans[len] = be;                print( len );                return;            }        }    }    for ( int i = 0; i < adj[x].size(); i ++ ){        if ( vis[adj[x][i]] == 0 ){            vis[adj[x][i]] = 1;            ans[len] = adj[x][i];            dfs ( adj[x][i], len + 1 );            vis[adj[x][i]] = 0;        }    }}void solve(){    ans[0] = be;    vis[be] = 1;    dfs ( be, 1 );    return;}int main(){    ios::sync_with_stdio( false );    while ( init() ){        solve();    }    return 0;}


0 0