POJ-1637 Sightseeing tour(通过网络流判定混合图的欧拉回路)

《Kubernetes部署篇:基于x86_64+aarch64架构CPU+containerd一键离线部署容器版K8S1.33.3高可用集群》 阅读详情

题意:

给了一个n个点s条边混合图,即存在无向边和有向边。(会有重边,会有自环)

思路:

来源于网上kuangbin大神的思路。

自己的理解:

1. 首先其实有向图是无向图增加了约束之后得到的嘛,所以对于混合图肯定要全部转为有向图去做,而有向图存在欧拉回路的充要条件是所有顶点的入度和出度值相同。所以问题就转为了如何确定混合图中的无向边的方向。

2. 如果事先假定无向边为某一个方向,那么在之后需要改变无向边的方向时,该操作会造成两个顶点的入度-1 出度+1,和入度+1 出度-1。所以解决这题的最关键的一步就是将某个顶点的入度和出度结合起来,即设置一个D(v)值,表示v点的出度-入度。从而无向边的方向改变对D(v)的影响变成了要么+2,要么-2。所以如果初始存在一点i的D(i)为奇数,则直接可判为不存在欧拉回路。

3. 如果D(v)都为偶数,接下来就是另一个关键点,把问题转化为求解最大流,因为进行走欧拉回路,那么肯定再需要处理出度!=入度的点,一种方法是,超级源点S与D(v) > 0的点建边,容量为D(v)/2,D(v) < 0的点与超级汇点进行建边,容量为-D(v)/2。除2是因为改变一个无向边会造成D(v)的-2,+2操作。另外,网络中保留的只是之前暂时确定的无向边,并令其容量为1,表示该条无向边只能再被改变一次。所以很容易能想通:如果所有的出度>入度的点多余的度数能通过图中的无向边流入出度<入度的点,并最终全流入超级汇点则表示混合图存在欧拉回路了。

4. 通过上述思路,在读入边时遇到自环,便可直接忽略(不会造成这个点D(v)改变),遇到重边时,只需通过其计算对点的入度出度的影响即可,其他地方不再需要。


代码:

#include <algorithm>
#include <string.h>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 205;
const int maxm = 2005;
struct node1
{
	int v, next;
}edge1[maxm];
struct node  
{  
    int v, w, next;  
}edge[maxm+maxn];
int no1, head1[maxn];
int vis1[maxn], cnt;
int n, m;
int D[maxn];
queue<int> q;
int no, head[maxn];
int dis[maxn], pre[maxn], rec[maxn], block[maxn];
int maxflow;
inline void init()
{
	no1 = 0;
	memset(head1, -1, sizeof head1);
	memset(vis1, 0, sizeof vis1);
	memset(D, 0, sizeof D);
	no = 0;
    memset(head, -1, sizeof head);
}
inline void add(int u, int v)
{
	edge1[no1].v = v;
	edge1[no1].next = head1[u];
	head1[u] = no1++;
}
inline void add(int u, int v, int w)  
{  
    edge[no].v = v; edge[no].w = w;  
    edge[no].next = head[u]; head[u] = no++;  
    edge[no].v = u; edge[no].w = 0;  
    edge[no].next = head[v]; head[v] = no++;  
}
int tmp = 100;
void dfs(int cur)
{
	vis1[cur] = 1;
	++cnt;
	for(int k = head1[cur]; k != -1; k = edge1[k].next)
	{
		if(vis1[edge1[k].v]) continue;
		dfs(edge1[k].v);
	}
}
int mapping(int S, int T)
{
	maxflow = 0;
	for(int i = 1; i <= n; ++i)
	{
		if(abs(D[i])&1) return 0;
		if(D[i] > 0) add(S, i, D[i]/2), maxflow += D[i]/2;
		if(D[i] < 0) add(i, T, -D[i]/2);
	}
	return 1;
}
void reset(int S, int T)  
{  
    memset(dis, 0x3f, sizeof dis);  
    memset(block, 0, sizeof block);  
    q.push(S); dis[S] = 0;  
    while(!q.empty())  
    {  
        int top = q.front(); q.pop();  
        for(int k = head[top]; k != -1; k = edge[k].next)  
        if(dis[edge[k].v] == inf && edge[k].w)  
            dis[edge[k].v] = dis[top]+1, q.push(edge[k].v);  
    }  
}  
int dinic(int S, int T)  
{  
    int ans = 0, flow = inf, top = S;  
    pre[S] = S;  
    reset(S, T);  
    while(dis[T] != inf)  
    {  
        int k, tmp;  
        for(k = head[top]; k != -1; k = edge[k].next)  
        {  
            if(edge[k].w && dis[edge[k].v]==dis[top]+1 &&   
            !block[edge[k].v]) break;  
        }  
        if(k != -1)  
        {  
            tmp = edge[k].v;  
            flow = min(flow, edge[k].w);  
            pre[tmp] = top, rec[tmp] = k;  
            top = tmp;  
            if(top == T)  
            {  
                ans += flow; tmp = -1;  
                for(; top != S; top = pre[top])  
                {  
                    edge[rec[top]].w -= flow;  
                    edge[rec[top]^1].w += flow;  
                    if(!edge[rec[top]].w) tmp = top;  
                }  
                flow = inf;  
                if(tmp != -1)  
                {  
                    top = pre[tmp];  
                    for(; top != S; top = pre[top])  
                    flow = min(flow, edge[rec[top]].w);  
                    top = pre[tmp];  
                }  
            }  
        }  
        else  
        {  
            block[top] = 1;  
            top = pre[top];  
            if(block[S]) reset(S, T);  
        }  
    }  
    return ans;  
}
int main()
{
	int t, u, v, key;
	scanf("%d", &t);
	while(t--)
	{
		init();
		scanf("%d %d", &n, &m);
		for(int i = 1; i <= m; ++i)
		{
			scanf("%d %d %d", &u, &v, &key);
			if(u == v) continue;
			add(u, v);
			++D[u], --D[v];
			if(!key) add(v, u), add(u, v, 1);
		}
		cnt = 0; dfs(1);
		if(cnt != n)
		{
			puts("impossible");
			continue;
		}
		int S = 0, T = 201;
		if(!mapping(S, T))
		{
			puts("impossible");
			continue;
		}
		if(dinic(S, T) == maxflow) puts("possible");
		else puts("impossible");
	}
	return 0;
} 


继续加油~

GameFramework框架详解之 框架总览 一.前言 目前市场上有很多优秀个开源框架,比如ET,GameFramework,DBFramework,StrangeIOC,Loxodon-Framework,KSFramework,xluaFramework等等。其中要说规范的话,不得不说GameFramework还是不错的,当然很多新手看到后会觉的有点复杂,写一个小小的功能,不得不套用一堆东西,继承一堆接口,感觉不知所措,不能随心所欲的去撸代码。其实这个框架就是为了约束新手的行为的,让我们面向接口编程,遵循“开闭”的设计原则来写代码,方便后期的扩 阅读详情

相关推荐

livebos报表开发

文章目录1.参数的设定2.展示的内容3.综合展示的效果4.调用过程5.可以在数据库里面查看6.注意事项7.过程代码 1.参数的设定 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-flb5C49A-1619516341977)(/uploads/xinxibuneibuzhishiku/images/m_bc71bb4608053778dbf29e06cd102ae1_r.png)] 2.展示的内容 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-

阿浪的专栏 709

POJ - 1637 Sightseeing tour(混合图欧拉回路的求解--建图跑最大流)

题目链接:https://vjudge.net/contest/399194#problem/B The city executive board in Lund wants to construct a sightseeing tour by bus in Lund, so that tourists can see every corner of the beautiful city. They want to construct the tour so that every street in the

zaiyang遇见 418

Win10家庭版中文用户名改英文全攻略:从注册表到环境变量一步不落

本文详细介绍了Windows 10家庭版中文用户名改为英文的完整流程,包括注册表编辑、环境变量调整等关键步骤。通过激活管理员账户、重命名用户文件夹、修改注册表键值等操作,彻底解决因中文路径导致的软件兼容性问题,并提供常见错误解决方案和系统维护建议。

weixin_29227425的博客 428

POJ 1637 Sightseeing tour(网络流,混合欧拉回路)

The city executive board in Lund wants to construct a sightseeing tour by bus in Lund, so that tourists can see every corner of the beautiful city. They want to construct the tour so that every street...

天涯沧海的博客 225

从TCGA官网获取新版count数据并精准转换为TPM的实战指南

本文详细介绍了从TCGA官网获取新版count数据并精准转换为TPM的实战指南。通过TCGAbiolinks工具下载原始count数据,结合GENCODE v36注释文件计算基因有效长度,最终实现count到TPM的标准化转换,确保数据完整性和分析可靠性。文章包含完整代码示例和常见问题解决方案,特别适合生物信息学研究人员参考。

weixin_27310417的博客 284

SAP批量数据导入实战:BDC、CATT、LSMW三大工具保姆级对比教程

本文深入对比了SAP系统中三大批量数据导入工具BDC、CATT和LSMW的核心定位、适用场景与实战操作。BDC适合复杂逻辑的编程式处理,CATT适合业务用户快速录制回放,LSMW则是数据迁移项目的结构化首选。文章提供了详细的选型决策框架、性能优化技巧及常见陷阱规避指南,帮助SAP顾问和开发者高效完成数据批量维护任务。

weixin_29213525的博客 153

POJ1637 Sightseeing tour 网络流

题目中既有有向边又有五项边

xig2004的博客 389

【camera-radar】基于ROS的多传感器融合感知系统实现(雷达+相机)(2)

实现功能:代码下载地址:下载地址 1)基于深度学习的目标检测;2)基于雷达的距离估计和预测;3)多传感器感知结果融合模块。 相机感知模块解析 4. Run nodes: python3 fusion_node/main.py python3 gps_node/main.py python3 radar_node/main.py python3 2d_detection_node/main.py #(additional instructions in 2d_detection_node/README.m

踟蹰横渡口,彳亍上滩舟。 9951

poj 1637 Sightseeing tour 【网络流 求解混合欧拉回路是否存在】

Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8331   Accepted: 3522 Description The city executive board in Lund wants to construct a sigh

世界很大 653

YOLOv11 改进 - 注意力机制 | 空间增强注意力SEAM(Spatially Enhanced Attention Module)提升遮挡场景检测鲁棒性

本文介绍了分离与增强注意力模块(SEAM)在YOLOv11中的结合应用。SEAM模块旨在增强面部特征学习能力,特别是处理面部遮挡问题。它采用多头注意力机制强调面部区域、抑制背景区域,第一部分使用深度可分离卷积减少参数并学习通道重要性,通过1x1卷积增强通道联系,利用两层全连接网络融合通道信息,经指数归一化后作为注意力权重与原始特征相乘。我们将SEAM集成到YOLOv11的检测头中,并进行相关注册和配置。实验表明,该方法有助于提升模型检测性能。

魔改工程师的博客 1666

【GameFramework框架内置模块】1、全局配置(Config)

这是GameFramework框架内置模块的第一篇,全局配置Config,讲解这些模块的时候会尽量的涉及介绍、为什么使用、如何使用、代码分析这几块,让大家可以知其然,也知其所以然。全局配置表,存储了一些游戏中使用的全局的参数配置,比如玩家的初始速度、游戏初始音量等。全局配置表的结构跟DataTable结构类似,也是列行+键值对,只是没有ID这一列,因为全局配置也不需要用ID去查询, 是直接使用key值进行查询。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 5886

POJ1637 Sightseeing tour(混合欧拉图的判断)

给出一张混合图(有有向边,也有无向边),判断是否存在欧拉回路。 首先是对图中的无向边随意定一个方向,然后统计每个点的入度(indeg)和出度(outdeg),如果(indeg - outdeg)是奇数的话,一定不存在欧拉回路; 如果所有点的入度和出度之差都是偶数,那么就开始网

laoda扯一扯 2242

基于STM32设计的智能家居控制系统(华为云)_363

本项目设计并实现了一种基于STM32的智能家居控制系统,融合了语音识别、远程控制、环境监测与安全报警等功能。系统以STM32F103C8T6单片机为核心控制器,集成ESP8266 Wi-Fi模块实现与华为云IOT物联网平台的数据交互,采用MQTT协议进行通信。用户可通过语音识别模块控制风扇、空调、窗帘、卧室灯、客厅灯和电视等家电的开关操作,同时也可通过Android手机APP或Windows电脑上位机进行远程控制。系统还具备温湿度、光照强度、烟雾浓度和火焰检测功能,当检测到异常情况时,自动触发蜂鸣器报警并向

883

poj1637Sightseeing tour(混合图欧拉回路)

题目请戳这里 题目大意:求混合图欧拉回路。 题目分析:最大流。竟然用网络流求混合图的欧拉回路,涨姿势了啊啊。。 其实仔细一想也是那么回事。欧拉回路是遍历所有边一次又回到起点的回路。双向图只要每个点度数为偶数即可,有向图要保证所有点入度等于出度。求路径的话,dfs即可。 混合图的话,就比较复杂。首先将有向边定向,求出所有点的入度和出度,如果某个点入度和出度之差为奇数,则一定不存在欧拉回路,因

ophunter的专栏 2032

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

poj 1637 Sightseeing tour(混合图欧拉回路)

混合图判断欧拉回路需要转换为网络流问题,首先把无向边当作有向边,然后对于每个点,如果存在点的入度和出度之差为奇数的话,就肯定不存在欧拉回路。对于都是偶数的情况,我们需要对于入度大于出度的点i,我们需要加一条源点到点i的边,容量为出入度差值的一半(因为只需要改变一半边的方向就可以使得点i满足入度等于出度),对于出度大于入度的边,需要加一条点i到汇点的边,容量为出入度差值的一半。然后对于原来的无向边,

ok_again的专栏 1287

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

[POJ 1637]Sightseeing tour[混合图欧拉回路]

题目链接:[POJ 1637]Sightseeing tour[混合图欧拉回路] 题意分析: 在一个有着单向边和双向边的图中,问:是否存在欧拉回路?(题目保证图连通) 解题思路: 欧拉回路的特点是:图中的所有点入度等于出度。然而这题多了个无向边。 我们可以考虑把无向边当成:能够随意变向的有向边。初始的时候,随意给无向边一个方向。 所以我们得到了一个弱化的初始判断条件:当某个点出度-入度

闲停 638

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【POJ1637】Sightseeing tour 混合图求欧拉回路存在性 网络流、

题意:多组数据,最后的0/1表示0无向1有向。 问是否存在欧拉回路。 题解:无向边给它任意定个向。 首先欧拉回路中点入度=出度。 然后发现每个无向边如果修改个方向,原来的入点的入度+1,出度-1,出点反之。 然后我们不妨对入度和出度不同的点跟源汇中之一连边,容量为入出度差一半(每改一条边差-2) 然后原来的无向边联系图中各点,容量1,最后check if(maxflow

辗转山河弋流歌 1404

POJ 1637 Sightseeing tour 混合图欧拉回路问题

http://poj.org/problem?id=1637 Description The city executive board in Lund wants to construct a sightseeing tour by bus in Lund, so that tourists can see every corner of the beautiful city. They want...

xiji333的博客 253

【最大流+混合图欧拉回路】POJ-1637 Sightseeing tour

Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K       Description The city executive board in Lund wants to construct a sightseeing tour by bus in Lund, so tha

JSure的代码库 844

欧拉路径问题【poj 1637 Sightseeing tour】

注:参考网上大牛说明http://blog.youkuaiyun.com/weiguang_123/article/details/7775762,加上一点自己的理解。 1.无向图是否具有欧拉通路或回路的判定 G有欧拉通路的充要条件为:G 连通且G中只有两个奇度顶点(它们分别是欧拉通路的两个端点)。 G有欧拉回路(G为欧拉图):G连通且G中均为偶度顶点。 2.有向图是否具有欧拉通路

797

poj1637 Sightseeing tour (混合图欧拉回路)

有向图存在欧拉回路的条件:所有点入度=出度。 对于混合图,可以先把所有的无向边假设一个方向。 但是所有的假设不一定都正确,此时需要调整边的方向。 怎样调整呢?这是就要使用网络流。 设每个点入度为in[i],出度为out[i], 对于每一个点i,如果in[i] > out[i],从源点到i连一条容量为(in[i] - out[i]) / 2的边, 如果out[i] > in[i],从i到

Shion的专栏 518

POJ 1637 Sightseeing tour (混合图欧拉回路)

建图方法: 把该图的无向边随便定向,计算每个点的入度和出度。如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路。因为欧拉回路要求每点入度 = 出度,也就是总度数为偶数, 若在奇数度点必不能有欧拉回路。 好了,现在每个点入度和出度之差均为偶数。那么将这个偶数除以2,得x。也就是说,对于每一个点,只要将x条边改变方向(入>出就是变入,出>入就是变出),就能保证出= 入。如果每个点都是出=入,

yomin on the way 667

POJ - 1637 Sightseeing tour 混合图欧拉回路的判断(最大流)

传送门:POJ1637 题意:给出一个混合图,判断是否存在欧拉回路。 用网络流判断混合图中是否存在欧拉回路方法及证明: 【混合图】 混合图(既有有向边又有无向边的图)中欧拉环、欧拉路径的判定需要借助网络流! (1)欧拉环的判定: 一开始当然是判断原图的基图是否连通,若不连通则一定不存在欧拉环或欧拉路径(不考虑度数为0的点)。 其实,难点在于图中的无向边,需要对所有的无

WA是一笔财富 310

poj1637 Sightseeing tour(混合图欧拉回路)

题目链接 题意 给出一个混合图(有无向边,也有有向边),问能否通过确定无向边的方向,使得该图形成欧拉回路。 思路 这是一道混合图欧拉回路的模板题。 一张图要满足有欧拉回路,必须满足每个点的度数为偶数。 对于这道题,我们先随便给无向边定个向。这时能够形成欧拉回路的必须条件就是每个点的入度和出度之差为偶数。 在满足了这个条件之后,我们通过网络流来判断是否可以形成欧拉回路。 下面用\(rd\)...

diecimu4798的博客 149

POJ 1637 Sightseeing tour

这道题是第一道欧拉回路(混合图求欧拉回路)的题,还算比较顺利地过掉了。 1 定义 欧拉通路 (Euler tour)——通过图中每条边一次且仅一次,并且过每一顶点的通路。欧拉回路 (Euler circuit)——通过图中每条边一次且仅一次,并且过每一顶点的回路。欧拉图——存在欧拉回路的图。 2 无向图是否具有欧拉通路或回路的判定 G有欧拉通路的充分必要条件为:G 连通,G中只有...

ahqsqs3474的博客 244

zoj 1992 || poj 1637 Sightseeing Tour

混合图的欧拉回路。以前没遇到过这种题,纠结啊。。。搜了下,发现是需要用最大流解的,隐约记得黑书上最大流有讲这个的,就去翻黑书了。黑书提供了两种算法,第一种自己模拟了下,觉得有点看不懂,觉得它书有的地方没说清楚,而且我自己模拟的结果不对 = =。。。第二种算法是网上大家经常用的,理解了下。大致就是,先将无向边定向,就是比如13,可以定它的方向为1->3,1的出度++,3的入度++即可。读入的时候如果遇到无向边,把这条边加入待建的网络中,流量为1。读入完后,然后用出度减入度得到x,如果x为奇数,肯定不存在欧拉回

小媛在努力~ 1919
上一篇: POJ-3270 Cow Sorting(贪心+置换)
下一篇: 哈密顿图和欧拉图知识小结
薄层
博客等级 码龄10年 242粉丝 289原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值