[诡异!]欧拉回路代码实现

这个代码实现了找到小的欧拉回路并将它们串联起来从而形成整个图的欧拉回路的过程。没有想明白为什么是正确的……我想那个循环是个关键点。

//读入一个无向图 进行欧拉回路判定 如果是 输出回路
#include <stdio.h>
#define MAXN 10010
int bl[MAXN][MAXN],match[MAXN],path[MAXN*2];
int tot,n,m,x,y;
bool can[MAXN][MAXN];
bool check_map() {
  for (int i = 1;i <= n;++i)
    if (match[i] & 1)
      return 0;
  return 1;
}
void find_path(int x) {
  if (!match[x]) {
    path[++tot] = x;
    return;
  }
  for (int i = 1;i <= bl[x][0];++i) {
    int k = bl[x][i];
    if ((!match[k]) || (!can[x][k])) continue;
    --match[x];
    --match[k];
    can[x][k] = can[k][x] = 0;
    find_path(k);
  }
  path[++tot] = x;
}
int main() {
  freopen("sample.in","r",stdin);
  freopen("sample.out","w",stdout);
  scanf("%d%d",&n,&m);
  for (int i = 1;i <= m;++i) {
    scanf("%d%d",&x,&y);
    bl[x][++bl[x][0]] = y;
    bl[y][++bl[y][0]] = x;
    ++match[x];
    ++match[y];
    can[x][y] = can[y][x] = 1;
  }
  if (!check_map()) {
    printf("ERROR!\n");
    return 0;
  }
  find_path(1);
  for (int i = 1;i < tot;++i)
    printf("%d---->",path[i]);
  printf("%d\n",path[tot]);
  return 0;
}

posted @ 2010-10-08 21:48  Sephiroth.L.  阅读(648)  评论(0编辑  收藏  举报