欧拉回路

什么是欧拉路径?在图上用一种走法经过所有的边一次且只有一次的路径叫做欧拉路径。即一笔画。

如果这条路径的起点和终点重合,那么就是欧拉回路。

如何判断图是否有欧拉回路或者欧拉路径?

无向图:因为欧拉路径中,除了起点与终点以外,任意点的“进”“出”次数相等,所以除了两个点为奇点(度数为奇数的点)(终点和起点)以外,其它点的度数均为偶数。

如果是欧拉回路,奇点的个数应该为0。

有向图:欧拉路径中,最多只有两个点的入度不等于出度。起点出度比入度大1,终点入度比出度大1。

如果是欧拉回路,所有点的 入度=出度 。

/*==================================================*\
| EulerPath -- 欧拉回路
| 连通图 -- 可用dfs判断
| 无向图: 不存在奇点
| 有向图: 入度=出度
\*==================================================*/
int n, m, G[maxn][maxn];
int a, b, in[maxn];
bool vis[maxn];

void dfs(int x) {
    for(int i = 1; i <= n; ++i) {
        if(G[x][i] && !vis[i]) vis[i] = 1, dfs(i);
    }
}

bool judge() {
    for(int i = 1; i <= n; ++i) if(in[i] % 2) return 0;

    int cnt = 0;
    for(int i = 1; i <= n; ++i) {
        if(!vis[i]) ++cnt, vis[i] = 1, dfs(i);
    }

    if(cnt > 1) return 0;
    return 1;
}

/*==================================================*\
| EulerPath -- 欧拉道路
| 无向图: 最多只有两个奇点
| 有向图: 有一个点的出度比入度大1,另一个点的入度比出度大一,其余相等
\*==================================================*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值