POJ 1438 One-way Traffic (混合图+边双连通)
<题目链接>
题目大意:
给定一个混合图,问你在能够使得图中所有点能够两两到达的情况下,尽可能多的将无向边变成有向边,输出这些无向边的变化方案。
解题分析:
这与之前做过的这道题非常类似 POJ 1515 ,不同的是,本题是混合图。总体的思路还是相同的,就是将无向边定向,但是原图中的桥一定只能是双向的,否则不可能使得所有点两两相互到达,之后就是记录一下无向边定向后的结果即可。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++)
#define clr(a,b) memset(a,b,sizeof a)
const int N = 2e3+ , M = N*N; struct Edge{ int to,nxt,fp,cur; }e[M]; //fp表示这是单向边,双向边,或者在原图中不存在,cur用来给这条边定向 int n,m,cnt,tot;
int head[N],low[N],dfn[N]; inline void init(){
cnt=tot=;
clr(dfn,);clr(head,-);clr(low,);
} inline void add(int u,int v,int flag){
e[cnt]=(Edge){v,head[u],flag,-};head[u]=cnt++;
} void Tarjan(int u,int pre){
dfn[u]=low[u]=++tot;
for(int i=head[u];~i;i=e[i].nxt){
int v=e[i].to;
if(v==pre)continue;
if(e[i].cur!=-)continue; //如果该边之前已经定过向
if(!e[i].fp)continue; //如果改边在原图中不存在
e[i].cur=,e[i^].cur=;
if(!dfn[v]){
Tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u])e[i].cur=e[i^].cur=;
}else low[u]=min(low[u],dfn[v]);
}
} int main(){
while(cin>>n>>m){
init();
rep(i,,m){
int u,v,c;scanf("%d%d%d",&u,&v,&c);
if(c==)add(u,v,),add(v,u,);
else add(u,v,),add(v,u,);
}
rep(i,,n) if(!dfn[i]){
Tarjan(i,-);
}
//只输出双向边的处理方案
for(int i=;i<cnt;i+=){
if(e[i].fp==&&e[i].cur==&&e[i^].cur==)printf("%d %d 2\n",e[i^].to,e[i].to);
else if(e[i].fp==&&e[i].cur==&&e[i^].cur==)printf("%d %d 1\n",e[i^].to,e[i].to); //e[i]边有效,所以是e[i^1].to--->e[i].to
else if(e[i].fp==&&e[i].cur==&&e[i^].cur==)printf("%d %d 1\n",e[i].to,e[i^].to);
}
}
}
POJ 1438 One-way Traffic (混合图+边双连通)的更多相关文章
- POJ 1637 Sightseeing tour (混合图欧拉路判定)
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6986 Accepted: 2901 ...
- POJ 1637 Sightseeing tour(混合图欧拉回路+最大流)
http://poj.org/problem?id=1637 题意:给出n个点和m条边,这些边有些是单向边,有些是双向边,判断是否能构成欧拉回路. 思路: 构成有向图欧拉回路的要求是入度=出度,无向图 ...
- poj 1438--One-way Traffic(边的双连通)
给定一个图,并给定边,a b c(c==1||c==2) 表示ab之间有c条边 求把尽可能多的有向边定向变成强联通图. 先把图当做无向图,加边时记录是否有边,dfs的时候不要把本没有的边用到!因为这个 ...
- POJ 2942.Knights of the Round Table (双连通)
简要题解: 意在判断哪些点在一个图的 奇环的双连通分量内. tarjan求出所有的点双连通分量,再用二分图染色判断每个双连通分量是否形成了奇环,记录哪些点出现在内奇环内 输出没有在奇环内的点的数目 ...
- 图的强连通&双连通
http://www.cnblogs.com/wenruo/p/4989425.html 强连通 强连通是指一个有向图中任意两点v1.v2间存在v1到v2的路径及v2到v1的路径. dfs遍历一个图, ...
- POJ 1637 - Sightseeing tour - [最大流解决混合图欧拉回路]
嗯,这是我上一篇文章说的那本宝典的第二题,我只想说,真TM是本宝典……做的我又痛苦又激动……(我感觉ACM的日常尽在这张表情中了) 题目链接:http://poj.org/problem?id=163 ...
- POJ 1637 混合图的欧拉回路判定
题意:一张混合图,判断是否存在欧拉回路. 分析参考: 混合图(既有有向边又有无向边的图)中欧拉环.欧拉路径的判定需要借助网络流! (1)欧拉环的判定:一开始当然是判断原图的基图是否连通,若不连通则一定 ...
- POJ 1637 Sightseeing tour ★混合图欧拉回路
[题目大意]混合图欧拉回路(1 <= N <= 200, 1 <= M <= 1000) [建模方法] 把该图的无向边随便定向,计算每个点的入度和出度.如果有某个点出入度之差为 ...
- POJ 1637 混合图欧拉回路
先来复习一下混合图欧拉回路:给定一张含有单向边和双向边的图,使得每一点的入度出度相同. 首先对于有向边来说,它能贡献的入度出度是确定的,我们不予考虑.对于无向图,它可以通过改变方向来改变两端点的出入度 ...
随机推荐
- Python在windows下编译成exe文件
1. pip install pyinstaller 2. 在Terminal下输入:“pyinstaller -F -w *.py” 就可以生成exe.生成的文件放在同目录dist下. -F(注意 ...
- amqp 抓包 不要在同一台机器
- rabbit localhost不能登录
解决方案 将C:\Users\{用户名}\.erlang.cookie 复制到 C:\Windows\System32\config\systemprofile 目录. 重启rabbitMQ服务 [转 ...
- j函数 判断以 什么开头
1.str.charAt(index) 返回字符串中指定位置的字符. str 是字符串 我们要将获得的数据 转化为字符串 var code = res.statusCode.toString(); ...
- LOJ 2840「JOISC 2018 Day 4」糖
有趣的脑子题(可惜我没有脑子 好像也可以称为模拟费用流(? 我们考虑用链表维护这个东西 再把贡献扔到堆里贪心就好了 大概就是类似于有反悔机制的贪心?我们相当于把选中的一个打上一个-v的tag然后如果选 ...
- Oracle RAC运维所遇问题记录二
oracle12c RAC源端与Dataguard目标端实时同步,因业务需求需要在源端增加PDB 1. 源端添加PDB CREATE PLUGGABLE DATABASE kdlxpdb admin ...
- 026:if标签使用详解
if标签使用详解: if 标签: if 标签相当于 Python 中的 if 语句,有 elif 和 else 相对应,但是所有的标签都需要用标签符号 {% %} 进行包裹. if 标签中可以使 ...
- 【Python】安装Python3,打印HelloWorld
安装地址: https://www.python.org/ 安装时勾选添加path然后一路next,搞定! 查看是否安装成功: cmd中输入python出现如下界面 在vscode中新建一个Hello ...
- php array_splice()函数 语法
php array_splice()函数 语法 作用:从数组中移除选定的元素,并用新元素取代它.dd马达价格 语法:array_splice(array,start,length,array) 参数: ...
- [CF959F]Mahmoud and Ehab and yet another xor task题解
搞n个线性基,然后每次在上一次的基础上插入读入的数,前缀和线性基,或者说珂持久化线性基. 然后一个num数组记录当时线性基里有多少数 然后每次前缀操作一下就珂以了 代码 #include <cs ...