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

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

//读入一个无向图 进行欧拉回路判定 如果是 输出回路
#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;
}

转载于:https://www.cnblogs.com/sephirothlee/archive/2010/10/08/1846133.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值