混合欧拉回路poj 1637 Sightseeing tour
把该图的无向边随便定向,计算每个点的入度和出度。如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路。因为欧拉回路要求每点入度 = 出度,也就是总度数为偶数,存在奇数度点必不能有欧拉回路;
好了,现在每个点入度和出度之差均为偶数。那么将这个偶数除以2,得x。也就是说,对于每一个点,只要将x条边改变方向(入>出就是变入,出>入就是变出),就能保证出=入。如果每个点都是出=入,那么很明显,该图就存在欧拉回路。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int M=;
const int inf=0x3f3f3f3f;
inline int read(){
int sum=,x=;
char ch=getchar();
while(ch<''||ch>''){
if(ch=='-')
x=;
ch=getchar();
}
while(ch>=''&&ch<='')
sum=(sum<<)+(sum<<)+(ch^),ch=getchar();
return x?sum:-sum;
}
inline void write(int x){
if(x<)
putchar('-'),x=-x;
if(x>)
write(x/);
putchar(x%+'');
}
struct node{
int v,w,nextt;
}e[];
int deep[M],cur[M],head[M],du[M],tot,s,t;
bool bfs(){
for(int i=;i<=t;i++)
deep[i]=;
queue<int>que;
que.push(s);
deep[s]=;
while(!que.empty()){
int u=que.front();
que.pop();
for(int i=head[u];~i;i=e[i].nextt){
int v=e[i].v;
if(e[i].w>&&deep[v]==){
deep[v]=deep[u]+;
if(v==t){
return true;
}
que.push(v);
}
}
}
return deep[t]==?false:true;
}
int dfs(int u,int fl){
if(u==t){
return fl;
}
int x,ans=;
for(int i=cur[u];~i;i=e[i].nextt){
int v=e[i].v;
if(e[i].w>&&deep[v]==deep[u]+){
x=dfs(v,min(fl-ans,e[i].w));
e[i].w-=x;
e[i^].w+=x;
if(e[i].w)
cur[u]=i;
ans+=x;
if(ans==fl)
return ans;
}
}
if(ans==)
deep[u]=;
return ans;
}
int dinic(){
int ans=;
while(bfs()){
//cout<<ans<<endl;
for(int i=;i<=t;i++)
cur[i]=head[i];
ans+=dfs(s,inf);
}
return ans;
}
void addedge(int u,int v,int w){
e[tot].v=v;
e[tot].w=w;
e[tot].nextt=head[u];
head[u]=tot++;
e[tot].v=u;
e[tot].w=;
e[tot].nextt=head[v];
head[v]=tot++;
}
void init(){
for(int i=;i<=t;i++)
head[i]=-,du[i]=;
tot=;
}
int main(){
int p=read(); while(p--){
int n=read(),m=read();
s=,t=n+;
init();
while(m--){
int u=read(),v=read(),op=read();
du[u]++,du[v]--;
if(!op)
addedge(u,v,);
}
//jud
int flag=;
for(int i=;i<=n;i++){
if(du[i]&){
flag=;
break;
}
}
if(flag){
puts("impossible");
continue;
}
int sum=;
for(int i=;i<=n;i++){
if(du[i]<)
addedge(i,t,-du[i]/);
else if(du[i]>)
addedge(s,i,du[i]/),sum+=du[i]/;
}
if(sum!=dinic())
puts("impossible");
else
puts("possible");
}
return ;
}
混合欧拉回路poj 1637 Sightseeing tour的更多相关文章
- POJ 1637 Sightseeing tour(最大流)
POJ 1637 Sightseeing tour 题目链接 题意:给一些有向边一些无向边,问能否把无向边定向之后确定一个欧拉回路 思路:这题的模型很的巧妙,转一个http://blog.csdn.n ...
- POJ 1637 - Sightseeing tour - [最大流解决混合图欧拉回路]
嗯,这是我上一篇文章说的那本宝典的第二题,我只想说,真TM是本宝典……做的我又痛苦又激动……(我感觉ACM的日常尽在这张表情中了) 题目链接:http://poj.org/problem?id=163 ...
- POJ 1637 Sightseeing tour (混合图欧拉回路)
Sightseeing tour Description The city executive board in Lund wants to construct a sightseeing tou ...
- POJ 1637 Sightseeing tour (混合图欧拉路判定)
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6986 Accepted: 2901 ...
- POJ 1637 Sightseeing tour (SAP | Dinic 混合欧拉图的判断)
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6448 Accepted: 2654 ...
- POJ 1637 Sightseeing tour
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9276 Accepted: 3924 ...
- 网络流(最大流) POJ 1637 Sightseeing tour
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8628 Accepted: 3636 ...
- POJ 1637 Sightseeing tour(混合图欧拉回路+最大流)
http://poj.org/problem?id=1637 题意:给出n个点和m条边,这些边有些是单向边,有些是双向边,判断是否能构成欧拉回路. 思路: 构成有向图欧拉回路的要求是入度=出度,无向图 ...
- POJ 1637 Sightseeing tour ★混合图欧拉回路
[题目大意]混合图欧拉回路(1 <= N <= 200, 1 <= M <= 1000) [建模方法] 把该图的无向边随便定向,计算每个点的入度和出度.如果有某个点出入度之差为 ...
随机推荐
- 2020/2/6 PHP编程学习
今天把后台数据库处理好了,用了框架后真就是搬砖的一天..晚上继续刷题,明天把数据库处理完,这样一个商城框架就有了:
- 给vector对象添加元素的方法
#include<iostream> #include<vector> using namespace std; int main() { //初始化10个元素,每个值都为0 ...
- Python爬虫连载1-urllib.request和chardet包使用方式
一.参考资料 1.<Python网络数据采集>图灵工业出版社 2.<精通Python爬虫框架Scrapy>人民邮电出版社 3.[Scrapy官方教程](http://scrap ...
- .NET微信开发 配置微信公众号基本配置的几种方法
自己最近搞了公众号,记录一下. 目的就是为了在微信公众号里启用服务器配置. 微信文档 其实微信文档已经写得很清楚了,也很简单.(微信的目的就是它发送一个get请求,希望我们能接受一下,然后给微信回个数 ...
- SQL基础教程(第2版)第4章 数据更新:4-3 数据的更新(UPDATE)
第4章 数据更新:4-3 数据的更新(UPDATE) ● 使用UPDATE语句可以更改(更新)表中的数据.● 更新部分数据行时可以使用WHERE来指定更新对象的条件.通过WHERE子句指定更新对象的U ...
- 用CNN及MLP等方法识别minist数据集
用CNN及MLP等方法识别minist数据集 2017年02月13日 21:13:09 hnsywangxin 阅读数:1124更多 个人分类: 深度学习.keras.tensorflow.cnn ...
- scala快排
笔记积累,直接看代码吧,sublime上运行的 def quickSort(ls:List[Int]):List[Int]={ if (ls.isEmpty) ls else quickSort(ls ...
- 扫描转换算法——DDA、中点画线画圆、椭圆
我的理解:在光栅图形学中,由于每一个点的表示都只能是整数值,所以光栅图形学实际只是对对实际图形的近似表示. 数值微分法(DDA):以下PPT截图来自北京化工大学李辉老师 代码实现: import ma ...
- Iptables的规则语法
Iptables的规则语法 分类: 防火墙2012-04-19 17:09 1228人阅读 评论(0) 收藏 举报 inputtcpfilter防火墙output网络 (一) 基本语法 iptable ...
- iOS 通过有alpha值的图片创建蒙版
@interface ViewController () @property (nonatomic, weak) IBOutlet UIImageView *imageView; @end @impl ...