POJ 1637 Sightseeing tour 混合图欧拉回路存在性判断

没有想到网络流还能解决这一类问题,完全想不到@_@

一开始把所有的无向边制定任意方向有当做有向边看,然后统计每个点的入度和出度。以前有向图的欧拉回路判定是每个点的入读都等于出度,这样可以保证可以回到起点,现在在一些边可以调换方向的情况下,所有定点的入度和出度之差必定为偶数,因为调换任意一条边的方向都会使两个定点的入度和出度变化2,所以要构成一个欧拉回路所有点的入度和出度之差都为偶数,并设差为deg。

现在问题转化成了能否通过改变一些边的方向来是的所有点的入度出度都为0,因为有向边的方向已经确定,不用理会,把他们全部都删去。剩下的边中如果有出度大于入度的,肯定要调换-deg/2条边来使其变成0,建立源点到这些点的边,容量为-deg/2,同理,有出入大于入度的,就建立这些点到汇点的边,容量同样为deg/2。其他的边容量都为1,然后做一遍最大流,如果流量和需要调换的边数相等,即源点出去的边全部都满载,就有欧拉回路存在,否则不存在欧拉回路。

为什么这样子是成立的,我的想法是这样的,除了连接源点和汇点的边之外,其他的边的容量都为1,1的流量对应的就是一条边,源点连接到一个点的时候的容量为t,如果满载相当于这个点出发的t条边满载,相当于调换了t条边,但是这样子会影响后面的边的度,不过因为流会一直流到汇点,中途所有的满载的边都是要调换的,所以中间原本度为0的点的度其实到最后不会改变。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map> 
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>using namespace std;typedef long long LL;
const int maxn = 205;
const int INF = INT_MAX / 3;struct Edge {int u,v,cap;Edge(int u,int v,int cap):u(u),v(v),cap(cap) {}
};int n,m,incnt[maxn],outcnt[maxn];
int deg[maxn],s,t;
vector<Edge> edges;
vector<int> e[maxn];void adde(int u,int v,int w) {int m = edges.size();edges.push_back(Edge(u,v,w));edges.push_back(Edge(v,u,0));e[u].push_back(m);e[v].push_back(m ^ 1);
}int level[maxn],q[maxn * 2],qs,qe;
bool bfs() {//建立层次网络memset(level,0,sizeof(level));level[s] = 1;qs = qe = 0;q[qe++] = s;while(qs < qe) {int now = q[qs++],nm = e[now].size();if(now == t) break;for(int i = 0;i < nm;i++) {Edge &ne = edges[e[now][i]];if(ne.cap && level[ne.v] == 0) {level[ne.v] = level[now] + 1;q[qe++] = ne.v;}}}return level[t];
}int dfs(int now,int alpha) {if(now == t) return alpha;int sum = 0,nm = e[now].size();for(int i = 0;i < nm;i++) {Edge &ne = edges[e[now][i]];if(level[now] + 1 == level[ne.v] && ne.cap && alpha) {int ret = dfs(ne.v,min(alpha,ne.cap));ne.cap -= ret; edges[e[now][i] ^ 1].cap += ret;sum += ret; alpha -= ret;}}if(sum == 0) level[now] = -1;return sum;
}void dinic() {while(bfs()) dfs(s,INF);
}bool solve() {s = 0; t = n + 1;//判断入度出度之差是否为偶数for(int i = 1;i <= n;i++) {deg[i] = incnt[i] - outcnt[i];if(deg[i] & 1) return false;}//建立容量网络for(int i = 1;i <= n;i++) {//如果入度小于出度,建立从起点到这个点的边,容量为deg/2if(deg[i] < 0) adde(s,i,-deg[i] / 2);//如果出度大于入读,建立从当前点到汇点的边,容量同样为deg/2if(deg[i] > 0) adde(i,t,deg[i] / 2);}//计算最大流dinic();//判断从源点出发的所有边是否满流int m = e[s].size();for(int i = 0;i < m;i++) {if(edges[e[s][i]].cap != 0) return false;}return true;
}int main() {int T; scanf("%d",&T);while(T--) {scanf("%d%d",&n,&m);edges.clear();for(int i = 0;i <= n + 1;i++) e[i].clear();memset(incnt,0,sizeof(incnt));memset(outcnt,0,sizeof(outcnt));for(int i = 1;i <= m;i++) {int u,v,c; scanf("%d%d%d",&u,&v,&c);//先将无向边全部作为有向边处理incnt[v]++; outcnt[u]++;//无向边存起来if(c == 0) adde(u,v,1);}if(solve()) puts("possible");else puts("impossible");}return 0;
}

  

转载于:https://www.cnblogs.com/rolight/p/3871431.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux系统 硬链接和软链接

背景&#xff1a; 当几个用户同在一个项目里工作时。经常须要共享文件。假设一个共享文件同一时候出如今属于不同用户的不同文件夹下。工作起来就非常方便。比如B和C文件夹下有一文件D是两者都能够訪问和改动的共享文件&#xff0c;这样是非常方便&#xff0c;但也会有一些问题…

jquery纯数字验证

$(document).ready(function(){ //纯数字验证,只让输入数字,比如-号等都不然输入。 $(#user-defined).unbind(); $(#user-defined).bind(keyup change,function () { $(this).val($(this).val().replace(/\D/g,));}); });转载于:https://www.cnblogs.com/kuiyeit/p/47940…

闪电模型数学_最经典的数学模型

最经典的数学模型怎样得到最好的女孩子的数学模型【关键词】怎样得到最好女孩子数学模型由于老天爷在你的生命中安排的异性并不是同时出现任你挑选&#xff0c;因此无论你在何时选择结婚都是有机会成本的。人们常常希望能够获得一个最可爱的人作为自己的伴侣。但是&#xff0c;…

最近提交一个mysql5.7的bug,提醒自己以后注意写SQL要规范

最近帮朋友提交一个mysql5.7的bug , oracle mysql 的大神还回复我 , 以后注意书写sql规范 , 潜台词是不是不要给他们增加工作量 https://bugs.mysql.com/bug.php?id86610转载于:https://www.cnblogs.com/kelvin19840813/p/7052983.html

openssl 学习之从证书中提取RSA公钥N 和 E

原文链接: http://blog.csdn.net/kkxgx/article/details/19850509 通常数字证书包含很多信息&#xff0c;其中N和E值即我们称为的公钥。如何从PEM 或者DER格式的证书中提出证书呢&#xff1f;下面给出代码实现从PEM和DER编码的证书中提出N、E。 [cpp] view plaincopy #include …

获得汉字字符个数

//获得汉字字符个数function ChineseWordsCount(text:string):Integer;var i,sum,e,c,t: Integer;begin Result:0; c : 0; sum : Length(text); if Sum0 then exit; for i : 0 to sum do begin if Ord(text[i]) > 127 then begin Inc(c); end; end;…

2020湖南省技能竞赛获奖名单_2020年湖南省职业院校技能竞赛学院获奖情况通报...

由湖南省教育厅、湖南省人力资源和社会保障厅、湖南省农业农村厅等30个单位联合举办的2020年湖南省职业院校技能竞赛于2019年12月28日已经圆满结束所有竞赛项目&#xff0c;我院选派了190名选手参加了园林景观设计与施工、鸡新城疫抗体水平测定、集成电路开发及应用、农机维修、…

Web browser的发展演变

我们每天都在使用着浏览器&#xff0c;每个人使用的浏览器各不一样。在这个科技飞速发展的时代&#xff0c;一个游览器能否站住脚跟取决于使用者的数量&#xff0c;看用户是否喜欢这个产品&#xff0c;听取用户们的意见来改善。 我们这个年龄的人最初用到的浏览器肯定是IE浏览器…

nodejs简单层级结构配置文件

在NodeJS中使用配置文件&#xff0c;有几种比较不错的方案&#xff1a;第一种&#xff1a;文件格式使用json是毋容置疑的好方案。格式标准&#xff0c;易于理解&#xff0c;文件内容读取到内存之后&#xff0c;使用JSON的标准分析函数即可得到配置项。第二种&#xff1a;将配置…

C++语言基础(1)-命名空间

一个中大型软件往往由多名程序员共同开发&#xff0c;会使用大量的变量和函数&#xff0c;当有两个人都同时定义了一个名字相同的全局变量或函数的时候&#xff0c;若是把他们的代码整合在一块编译&#xff0c;此时编译器就会提示变量或函数重复定义&#xff0c;C为了解决这个问…

matlab 散点图 线性回归图_线性回归思路梳理

作者&#xff1a;夏雨骄阳 封面&#xff1a;自己想吧1简单线性回归1根据研究目的确定因变量和自变量。2判断有无异常值。通过绘制散点图直观观察&#xff1b;亦可通过线性回归的【统计】→【个案诊断】→【所有个案】进行分析&#xff0c;若标准残差超过[-3,3]&#xff0c;则…

物联网云端设计分析

物联网是世界信息产业发展的新浪潮&#xff0c;智能手表、智能手环、智能灯等物联网产品不断的改变着人们的生活方式。那这些产品是怎么设计出来的呢&#xff1f;其实物联网操作系统不光由本地物联网设备上的操作系统组成&#xff0c;还包括提供物联网终端设备支持的云端架构。…

PHP使用文件流下载文件方法(附:解决下载文件内容乱码问题)

记得高中时候做过游戏私服&#xff0c;那时候的游戏主页是用PHP写的&#xff0c;因为文件很固定&#xff0c;客户端&#xff0c;登陆器和一些小工具&#xff0c;文件数目也不是很多&#xff0c;所以都是直接把下载链接写死的&#xff0c;直接链接到本地服务器的文件目录&#x…

Redis和Memcached的区别

2019独角兽企业重金招聘Python工程师标准>>> Redis的作者Salvatore Sanfilippo曾经对这两种基于内存的数据存储系统进行过比较&#xff1a; Redis支持服务器端的数据操作&#xff1a;Redis相比Memcached来说&#xff0c;拥有更多的数据结构和并支持更丰富的数据操作…

hbase hmaster一会就没了_浅析HBase

一、HBase简介1、Apache HBase™是Hadoop数据库&#xff0c;是一个分布式&#xff0c;可扩展的大数据存储。2、当您需要对大数据进行随机&#xff0c;实时读/写访问时&#xff0c;请使用Apache HBase™。 该项目的目标是托管非常大的表&#xff08; 数十亿的行*百万的列 &#…

【Android工具】DES终结者加密时报——AES加密演算法

转载请注明出处&#xff1a;http://blog.csdn.net/zhaokaiqiang1992在前面的两篇文章中。我们介绍了DES算法&#xff0c;3DES算法以及他们的Android程序实现&#xff0c;并研究了怎样才干实现不同平台下加密算法的一致性。只是话说起来&#xff0c;DES算法是在1976年被美国的国…

MATLAB 迭代法解方程

MATLAB 迭代法解方程 1、代码如下&#xff1a; %%牛顿迭代法解方程 function xnewton_interation(fun,dfun,x0,EPS) %简单牛顿迭代法%fun即迭代函数&#xff0c;dfun即迭代函数的一阶导数&#xff0c;x0为迭代初值&#xff0c;EPS为精度x1x0-fun(x0)/dfun(x0); %牛顿迭代公…

【12期 3月期刊 自荐】

12期的小伙伴看过来~因为网易博客的网络问题。我们把负责收集自荐的博客写到了CSDN里&#xff0c;希望大家在此篇博客的评论里&#xff0c;积极自荐自己的博客。 为了提高大家的积极性&#xff0c;我们评选优秀博客的方法升级为大家自荐博客&#xff0c;博客委员会当月负责人进…

超微服务器电源短接启动图解_教你一招,让你的电脑启动速度秒杀别人

win10快速启动其实是电脑的一种休眠模式&#xff0c;它将电脑中的一些本该关闭的文件保存到hiberfil.sys的磁盘文件中&#xff0c;这样打开电脑时就达到了快速开机的目的。接下来&#xff0c;我就将win10设置快速启动的方法分享给你们win10系统功能非常强大&#xff0c;最让大家…

MATLAB 求离散信号卷积

MATLAB 求离散信号卷积 代码如下&#xff1a; function [C,Ck] dt_convolution_advance(A,B,Ak,Bk) % dt_convolution_advance 计算离散信号卷积 % A 输入信号 % B 输入信号 % Ak 输入信号A下标 % Bk 输入信号B下标 % C 输出信号 % Ck 输出信号C下标 % 计算输入信号A&…