• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

╰☆惔、煙菋

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

HDU_1878 欧拉回路

做这题要分两步:

1:先判断每个节点的度是否都为偶数,若都是偶数,则有可能存在欧拉回路,只要出现一个节点的度为奇数,则可以肯定绝对没有欧拉回路

2:若所有节点的度都为偶数,再用并查集判断是不是从任意的节点走都可以走到其他的任意点,若可以则有欧拉回路,若不可以则没有

#include <stdio.h>
#define num 1000

int m, n, i, a, b, flag, du[num], set[num];

void init()
{
for (i = 1; i <= n; ++ i)
{
du[i]
= 0;
set[i] = i;
}
flag
= 0;
}

int find(int x)
{
int i, j, r = x;
while (r != set[r])
{
r
= set[r];
}
i
= x;
while (i != r)
{
j
= set[i];
set[i] = r;
i
= j;
}
return r;
}

void merge(int x, int y)
{
x
= find(x);
y
= find(y);
if (x < y) set[y] = x;
else set[x] = y;
}

int main()
{
while (scanf("%d", &n) && n)
{
init();
scanf(
"%d", &m);
while (m --)
{
scanf(
"%d %d", &a, &b);
merge(a, b);
du[a]
++;
du[b]
++;
}
for (i = 1; i <= n; ++ i)
{
if (du[i] & 1)
{
flag
= 1;
break;
}
}
if (!flag)
{
for (i = 2; i <= n; ++ i)
{
if (set[i] != 1)
{
flag
= 1;
break;
}
}
}
if (flag) puts("0");
else puts("1");
}
return 0;
}

posted on 2011-04-02 20:47  ╰☆惔、煙菋  阅读(1103)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3