poj1637 Sightseeing tour(混合图欧拉回路)
题意
给出一个混合图(有无向边,也有有向边),问能否通过确定无向边的方向,使得该图形成欧拉回路。
思路
这是一道混合图欧拉回路的模板题。
一张图要满足有欧拉回路,必须满足每个点的度数为偶数。
对于这道题,我们先随便给无向边定个向。这时能够形成欧拉回路的必须条件就是每个点的入度和出度之差为偶数。
在满足了这个条件之后,我们通过网络流来判断是否可以形成欧拉回路。
下面用\(rd\)表示入度,\(cd\)表示出度。
首先对于入度小于出度的点,我们从\(S\)向这个点连一条权值为\((cd - rd) / 2\)的边,表示我需要通过改变\((cd-rd)/2\)条边的方向,来使得当前点入度与出度相同。
相对的,对于入度大于出度的点,我们从这个点向T连一条权值为\((rd-cd)/2\)的边,表示我需要通过改变\((rd-cd)/2\)条边的方向,来使得当前点入度与出度相同。
对于原图中的无向边,我们就按照给他定的那个向连一条权值为\(1\)的边。表示我可以改变这条边的方向。
最后看一下是否可以满流即可。
代码
/*
* @Author: wxyww
* @Date: 2019-02-10 17:22:12
* @Last Modified time: 2019-02-10 17:31:12
*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<bitset>
using namespace std;
typedef long long ll;
const int N = 10000,INF = 1e9;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
struct node {
int v,w,nxt;
}e[N];
int head[N],ejs;
void add(int u,int v,int w) {
e[++ejs].v = v;e[ejs].w = w;e[ejs].nxt = head[u];head[u] = ejs;
e[++ejs].v = u;e[ejs].w = 0;e[ejs].nxt = head[v];head[v] = ejs;
}
int rd[N],cd[N];
int dep[N];
int S,T,cur[N];
queue<int>q;
int bfs() {
memset(dep,0,sizeof(dep));
while(!q.empty()) q.pop();
dep[S] = 1;q.push(S);
while(!q.empty()) {
int u = q.front();q.pop();
for(int i = head[u];i;i = e[i].nxt) {
int v = e[i].v;
if(!dep[v] && e[i].w) {
q.push(v);
dep[v] = dep[u] + 1;
if(v == T) return 1;
}
}
}
return 0;
}
int dfs(int u,int now) {
if(u == T) return now;
int ret = 0;
for(int &i = cur[u];i;i = e[i].nxt) {
int v = e[i].v;
if(dep[v] == dep[u] + 1 && e[i].w) {
int k = dfs(v,min(now - ret,e[i].w));
e[i].w -= k;
e[i ^ 1].w += k;
ret += k;
if(now == ret) return ret;
}
}
return ret;
}
int dinic() {
int ans = 0;
while(bfs()) {
memcpy(cur,head,sizeof(cur));
ans += dfs(S,INF);
}
return ans;
}
int main() {
int TT = read();
while(TT--) {
int n = read(),m = read();
S = n + 1,T = S + 1;
ejs = 1;memset(head,0,sizeof(head));
memset(rd,0,sizeof(rd));memset(cd,0,sizeof(cd));
for(int i = 1;i <= m;++i) {
int u = read(),v = read(),k = read();
rd[v]++;cd[u]++;
if(k == 1) continue;
add(u,v,1);
}
int bz = 0;
for(int i = 1;i <= n;++i) {
if((rd[i] + cd[i]) & 1) {
puts("impossible");
bz = 1;break;
}
if(rd[i] > cd[i]) add(i,T,(rd[i] - cd[i]) / 2);
if(cd[i] > rd[i]) add(S,i,(cd[i] - rd[i]) / 2);
}
if(bz == 1) continue;
dinic();
for(int i = head[S];i;i = e[i].nxt) {
if(e[i].w) {
puts("impossible");bz = 1;break;
}
}
if(bz == 1) continue;
puts("possible");
}
return 0;
}
poj1637 Sightseeing tour(混合图欧拉回路)的更多相关文章
- POJ1637 Sightseeing tour (混合图欧拉回路)(网络流)
Sightseeing tour Time Limit: 1000MS Me ...
- poj1637 Sightseeing tour 混合图欧拉回路判定
传送门 第一次做这种题, 尽管ac了但是完全不知道为什么这么做. 题目就是给一些边, 有向边与无向边混合, 问你是否存在欧拉回路. 做法是先对每个点求入度和出度, 如果一条边是无向边, 就随便指定一个 ...
- POJ 1637 Sightseeing tour ★混合图欧拉回路
[题目大意]混合图欧拉回路(1 <= N <= 200, 1 <= M <= 1000) [建模方法] 把该图的无向边随便定向,计算每个点的入度和出度.如果有某个点出入度之差为 ...
- POJ1637:Sightseeing tour(混合图的欧拉回路)
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10581 Accepted: 4466 ...
- poj 1637 Sightseeing tour 混合图欧拉回路 最大流 建图
题目链接 题意 给定一个混合图,里面既有有向边也有无向边.问该图中是否存在一条路径,经过每条边恰好一次. 思路 从欧拉回路说起 首先回顾有向图欧拉回路的充要条件:\(\forall v\in G, d ...
- POJ 1637 Sightseeing tour (混合图欧拉回路)
Sightseeing tour Description The city executive board in Lund wants to construct a sightseeing tou ...
- poj1637Sightseeing tour(混合图欧拉回路)
题目请戳这里 题目大意:求混合图欧拉回路. 题目分析:最大流.竟然用网络流求混合图的欧拉回路,涨姿势了啊啊.. 其实仔细一想也是那么回事.欧拉回路是遍历所有边一次又回到起点的回路.双向图只要每个点度数 ...
- poj1637 Sightseeing tour[最大流+欧拉回路]
混合图的欧拉回路定向问题. 顺便瞎说几句,有向图定欧拉回路的充要条件是每个点入度等于出度,并且图联通.无向图的话只要联通无奇点即可. 欧拉路径的确定应该是无向图联通且奇点数0个或2个,有向图忘了,好像 ...
- POJ 1637 Sightseeing tour(混合图的欧拉回路)
题目链接 建个图,套个模板. #include <cstdio> #include <cstring> #include <iostream> #include & ...
随机推荐
- day 7-20 视图,触发器,事务
一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- Dart语法基础
hello world // Define a function. printNumber(num aNumber) { print('The number is $aNumber.'); // Pr ...
- Could not render e, see the console.
错误截图: 解决: 在application.properties中开启swagger swagger2.enable=true
- IWMS后台上传文章,嵌入视频,调用优酷通用代码
<a href="http://player.youku.com/player.php/sid/XODcxNjM3OTYw/v.swf " target="_bla ...
- 一个实际的案例介绍Spring Boot + Vue 前后端分离
介绍 最近在工作中做个新项目,后端选用Spring Boot,前端选用Vue技术.众所周知现在开发都是前后端分离,本文就将介绍一种前后端分离方式. 常规的开发方式 采用Spring Boot 开发项目 ...
- 算法题 -- 输入一个Long数组,按要求输出一个等长的Long数组
/** * 输入一个Long数组,按要求输出一个等长的Long数组 * 输出数组的元素值等于,输入数组除相同下标外其他元素的积 * 如:输入[1, 2, 3, 4], 输出[24, 12, 8, 6] ...
- 树&图 记录
A - Lake Counting POJ - 2386 最最最最最基础的dfs 挂这道题为了提高AC率(糖水不等式 B - Paint it really, really dark gray Cod ...
- docker --环境变量制作模板
比如你现在有配置文件:decoder.conf decoder.conf里面有两个配置项写的是: THREAD_NUM:24 GPU_ID:0 现在你希望通过某个统一的配置来修改这些配置项,以免在部署 ...
- kvm 一些web管理3方工具
OpenNebula Proxmox VE
- Sublime Text3 如何开启Debug
打开setting-user 首选项——>Package Settings——>Package Control——>settings-user 添加"debug" ...