Two Paths

这篇博客介绍了如何在一个可能有重边且不保证联通的无向图中找到两条路径,覆盖所有边一次。首先,定义了奇点的概念,然后讨论了三种情况:1) 奇点数为0或2的连通块;2) 奇点数为4的连通块;3) 两个奇点数为0或2的连通块。最后,提供了实现思路和代码,代码中包含详细注释。
摘要由CSDN通过智能技术生成

一、题目

题目
给你一张可能有重边的不保证联通的无向图,现在要在这个图上找出两条路径,恰好能覆盖所有边一次,根据边的编号输出方案,无解输出-1。
数据范围
1 ≤ m ≤ 10000 , 1 ≤ a , b ≤ 10000 , a ̸ = b 1\leq m\leq 10000,1\leq a,b\leq10000 ,a\not=b 1m10000,1a,b10000,a̸=b

二、解法

思路
由于组成欧拉路的条件较为单一,我们来分类讨论一下。
(下文将会把度为奇数的点称为奇点)
1、有一个连通块,奇点数为 0 , 2 0,2 0,2,那我们随便选择一条边组成一个路径,另外的边组成另一条路径。
2、有一个连通块,奇点数为 4 4 4,那我们将两个奇数点连一条虚边,等于将图分成两个部分,从一个奇点出发,看能不能形成一条路径(实质上是题意中的两条)。
3、有两个连通块,奇点数取 0 , 2 0,2 0,2,直接跑即可。
代码
有很多细节没讲清楚,代码中会有详细注释。

#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
#define INF 0x3f3f3f3f
const int MAXN = 10005;
int read()
{
   
    int num=0,flag=1;
    char c;
    while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
    while(c
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值