http://poj.org/problem?id=2337

题意:按最字典序最小的顺序输出欧拉路。

这道题用的使用中回溯的方法,但是忘记掉叫什么名字了,暂时称其为欧拉路输出算法吧~

其核心代码为:

void find_eularpath(int u) {
    int sz = g[u].size();
    for(int i=0;i<sz;i++) {
        int v = g[u][i].v;
        if(!g[u][i].vis) {
            g[u][i].vis = 1;
            find_eularpath(v);
            sta.push(g[u][i].name);
        }
    }
}
void print_path() {
    string s = sta.top();
    sta.pop(); cout << s;
    while(!sta.empty()) {
        s = sta.top(); sta.pop();
        cout << "." << s;
    }
    cout << endl;
}

  

完整代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <stack>
using namespace std;
const int N = 26;
struct node {
    int v; bool vis; string name;
    node () { v = 0; vis = false; }
    bool operator < (const node & b) const {
        return name < b.name;
    }
};
int T , n , f[N] , d[N] , key;
vector <node> g[N];
stack <string> sta;
bool flag[N];
void init() { for(int i=0;i<N;i++) f[i] = i; }
int find(int x) { return x == f[x] ? x : f[x] = find(f[x]); }
void Union(int x,int y) {
    int a = find(x) , b = find(y); f[a]=f[b]=f[x]=f[y]=min(a,b);
}
bool check(int &key) {
    int ans1 = 0 , ans2 = 0;
    key = -1;
    for(int i=0;i<N;i++) {
        if(d[i] == 1) ans1 ++ , key = i;
        else if(d[i] == -1) ans2 ++;
        else if(d[i] != 0) return false;
    }
    int cnt = 0;
    for(int i=0;i<N;i++) {
        if(flag[i] && find(i) == i) cnt ++;
    }
    return cnt == 1;
}
void find_eularpath(int u) {
    int sz = g[u].size();
    for(int i=0;i<sz;i++) {
        int v = g[u][i].v;
        if(!g[u][i].vis) {
            g[u][i].vis = 1;
            find_eularpath(v);
            sta.push(g[u][i].name);
        }
    }
}
void print_path() {
    string s = sta.top();
    sta.pop(); cout << s;
    while(!sta.empty()) {
        s = sta.top(); sta.pop();
        cout << "." << s;
    }
    cout << endl;
}
void solve() {
    scanf("%d",&n);
    init();
    memset(d,0,sizeof(d));
    memset(flag,0,sizeof(flag));
    while(!sta.empty()) sta.pop();
    for(int i=0;i<N;i++) g[i].clear();
    char ch[111];
    for(int i=0;i<n;i++) {
        scanf("%s" , ch);
        int len = strlen(ch);
        int u = ch[0] - 'a' , v = ch[len-1] - 'a';
        Union(u , v);
        flag[u] = flag[v] = true;
        d[u] ++; d[v] --;
        node edge;
        edge.v = v; edge.vis = false;
        edge.name = ch;
        g[u].push_back(edge);
    }
    if(!check(key)) {
        puts("***");
        return;
    }
    for(int i=0;i<N;i++) {
        sort(g[i].begin() , g[i].end());
    }
    if(key == -1) {
        for(int i=0;i<N;i++)
            if(flag[i]) {
                find_eularpath(i);
                break;
            }
    }
    else find_eularpath(key);
    print_path();
}
int main() {
    scanf("%d" , &T);
    while(T--) {
        solve();
    }
    return 0;
}

  

 posted on 2013-09-17 16:30  tobec  阅读(230)  评论(0编辑  收藏  举报