求出欧拉回路,欧拉路径

 

 


注意, qsz 应该是从2开始的 因为用到了^1
无向图
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn = 1e3+50;
struct Edge{
    int st;
    int lst;
    int to;
}edge[maxn*5];
int head[maxn];
int qsz;

inline void add(int u, int v) {
    edge[qsz].st = u;
    edge[qsz].lst = head[u];
    edge[qsz].to  = v;
    head[u] = qsz++;
}

int in[maxn];
int ans[5*maxn];
bool vis[5*maxn*2];
int qcnt;

void dfs(int u) {
    int i;
    for (i=head[u]; i; i=edge[i].lst) {
        if (!vis[i]) {
            vis[i] = true;
            vis[i^1] = true;
            dfs(edge[i].to);
            // ans[q++] = i; //记录回路的边.
        }
    }
    ans[qcnt++] = u; // 记录回路的点
    // 答案是与起点颠倒的. 
}

int main()
{
    int t, n, m, i, j, u, v;
    // init;
    qsz = 2;
    memset(head, 0, sizeof(head));
    qcnt = 0;
    
    scanf("%d%d", &n, &m);
    for (i=1; i<=m; ++i) {
        scanf("%d%d", &u, &v);
        add(u, v);
        add(v, u);
        in[v]++; in[u]++;
    }
    bool flag = true;
    for (i=1; i<=n; ++i) 
        if (in[i] & 1) {
            dfs(i);
            flag = false;
            break;
        }
    if (flag) dfs(1); // 例如两个骨牌是 (1, 2) (1, 2) 这样的情况,两个端点就不是奇数次出现. 这个时候随便选一个作为起点就OK. 
    for (i=0; i<qcnt; ++i) 
        printf("%d ", ans[i]);
    return 0;
}

 

 

 

posted @ 2018-10-08 14:21  过路人1998  阅读(123)  评论(0编辑  收藏  举报