uva 10054(欧拉回路+并查集)

来源:互联网 发布:ear cuff淘宝 编辑:程序博客网 时间:2024/06/07 13:03

题解:明显的欧拉回路,先用并查集判断是否连通,然后计算每个结点的度数是否是偶数,最后递归将欧拉回路压栈,最后输出。

#include <stdio.h>#include <string.h>const int N = 55;int G[N][N], du[N], flag;void init() {    memset(du, 0, sizeof(du));    memset(G, 0, sizeof(G));    flag = 0;}void judge1() {    int i;    for (i = 0; i <= 50; i++)        if (du[i] % 2 != 0) {            flag = 1;        }}void euler(int u) {    for (int v = 0; v <= 50; v++) {        if (G[u][v]) {            G[u][v]--;            G[v][u]--;            euler(v);            printf("%d %d\n", v, u);        }    }}int main() {  int t, n, v1, v2, cases = 1, i;  scanf("%d", &t);  while (t--) {    init();    scanf("%d", &n);    for (i = 0; i < n; i++) {        scanf("%d%d", &v1, &v2);        G[v2][v1]++;        G[v1][v2]++;        du[v1]++;        du[v2]++;    }    judge1();    printf("Case #%d\n", cases++);    if (flag)        printf("some beads may be lost\n");    else {        for (i = 0; i <= 50; i++)            if (du[i])                break;        euler(i);    }    if (t)      printf("\n");  }  return 0;}


0 0
原创粉丝点击