POJ 1438 One-way Traffic
意甲冠军:
与 http://blog.csdn.net/houserabbit/article/details/38958891 类别似 仅仅不是将原本的无向图变为混合图
思路:
在上一篇我也写过了 http://blog.csdn.net/houserabbit/article/details/38958891 首先是找桥 那么就须要先把混合图变成无向图 由于题目说答案存在 因此桥必定是混合图里的无向边
然后就是块内的工作了 也是分两种边讨论 仅仅只是判定边是否留下的时候要看一下它是不是原图的无向边 由于有向边是不能动的 最后略微改一下输出 基本与上一篇一致
因此我们能够总结出一种思路 对于基于删边的构造强连通图的方法——找桥+块内dfs分2种边讨论 以前也以前做过基于加边的构造强连通图 大致方法就是——强连通缩点+入度出度讨论
代码:
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#include<vector>
using namespace std;
typedef long long LL;
#define N 2010
#define M 4000010
#define inf 2147483647 int n,m,t=1,tot,idx;
int head[N],dfn[N],low[N];
struct edge
{
int u,v,next;
bool vis,cut,left,dir,exit;
}ed[M]; void add(int u,int v,bool dir,bool exit)
{
ed[tot].u=u;
ed[tot].v=v;
ed[tot].next=head[u];
ed[tot].vis=ed[tot].cut=ed[tot].left=false;
ed[tot].dir=dir;
ed[tot].exit=exit;
head[u]=tot++;
} void tarjan(int u)
{
int i,v;
dfn[u]=low[u]=++idx;
for(i=head[u];~i;i=ed[i].next)
{
v=ed[i].v;
if(ed[i].vis) continue;
ed[i].vis=ed[i^1].vis=true;
if(dfn[v]==-1)
{
tarjan(v);
low[u]=min(low[u],low[v]);
if(dfn[u]<low[v])
{
ed[i].cut=ed[i^1].cut=true;
ed[i].left=ed[i^1].left=true;
}
}
else low[u]=min(low[u],dfn[v]);
}
} void dfs(int u)
{
int i,v;
dfn[u]=low[u]=++idx;
for(i=head[u];~i;i=ed[i].next)
{
if(ed[i].cut||!ed[i].exit) continue;
v=ed[i].v;
if(dfn[v]==-1)
{
ed[i].vis=ed[i^1].vis=true;
dfs(v);
low[u]=min(low[u],low[v]);
if(!ed[i].dir)
{
if(low[v]>dfn[u]) ed[i^1].left=true;
else ed[i].left=true;
}
}
else
{
low[u]=min(low[u],dfn[v]);
if(!ed[i].vis&&!ed[i].dir) ed[i].left=true;
ed[i].vis=ed[i^1].vis=true;
}
}
} void solve()
{
int i;
memset(dfn,-1,sizeof(dfn));
idx=0;
tarjan(1);
memset(dfn,-1,sizeof(dfn));
idx=0;
for(i=0;i<tot;i++) ed[i].vis=false;
for(i=1;i<=n;i++)
{
if(dfn[i]==-1) dfs(i);
}
} int main()
{
int i,u,v,k;
while(~scanf("%d%d",&n,&m))
{
tot=0;
memset(head,-1,sizeof(head));
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&k);
if(k&1)
{
add(u,v,true,true);
add(v,u,true,false);
}
else
{
add(u,v,false,true);
add(v,u,false,true);
}
}
solve();
for(i=0;i<tot;i+=2)
{
if(ed[i].dir) continue;
if(ed[i].left&&ed[i^1].left) printf("%d %d 2\n",ed[i].u,ed[i].v);
else if(ed[i].left) printf("%d %d 1\n",ed[i].u,ed[i].v);
else printf("%d %d 1\n",ed[i].v,ed[i].u);
}
}
return 0;
}
版权声明:本文博客原创文章。博客,未经同意,不得转载。
POJ 1438 One-way Traffic的更多相关文章
- POJ 1438 One-way Traffic (混合图+边双连通)
<题目链接> 题目大意: 给定一个混合图,问你在能够使得图中所有点能够两两到达的情况下,尽可能多的将无向边变成有向边,输出这些无向边的变化方案. 解题分析:这与之前做过的这道题非常类似 P ...
- poj 1515+poj 1438(边双连通)
题目链接:http://poj.org/problem?id=1515 思路:题目的意思是说将一个无向图改成有向图,使其成为强连通,输出所有的边.我们可以求无向图的边双连通分量,对于同一个双连通分量, ...
- poj 1438--One-way Traffic(边的双连通)
给定一个图,并给定边,a b c(c==1||c==2) 表示ab之间有c条边 求把尽可能多的有向边定向变成强联通图. 先把图当做无向图,加边时记录是否有边,dfs的时候不要把本没有的边用到!因为这个 ...
- POJ 2225 / ZOJ 1438 / UVA 1438 Asteroids --三维凸包,求多面体重心
题意: 两个凸多面体,可以任意摆放,最多贴着,问他们重心的最短距离. 解法: 由于给出的是凸多面体,先构出两个三维凸包,再求其重心,求重心仿照求三角形重心的方式,然后再求两个多面体的重心到每个多面体的 ...
- TRAFFIC LIGHTS POJ 1158
题目大意: 在Dingilville 城市安排是一种不同寻常的方式,每个交叉路口有一条道路连接,一条道路最多连接两个不同的交叉路口.每个交叉路口不能连接他自己.道路旅行一端到另一端的时间是相同的,任何 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- 【转】POJ百道水题列表
以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...
- POJ 1637 Sightseeing tour (混合图欧拉路判定)
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6986 Accepted: 2901 ...
- poj 2485 Highways
题目连接 http://poj.org/problem?id=2485 Highways Description The island nation of Flatopia is perfectly ...
随机推荐
- 18.1 IIC驱动程序(基于3.4.2内核)
驱动使用smbus提供的IIC读写函数可以参考smbus-protocol.txt文档:应用层直接使用IIC读写函数读写IIC设备,应用层读写函数是由i2c-tools这个库提供的(编译的使用和应用程 ...
- c#之mysql四种带事务批量插入
前言 对于像我这样的业务程序员开发一些表单内容是家常便饭的事情,说道表单 我们都避免不了多行内容的提交,多行内容保存,自然要用到数据库,如果循环打扰我数据库,数据库也会觉得很累,从而增加数据库服务器压 ...
- Voronoi Diagram——维诺图
Voronoi图定义 任意两点p 和q 之间的欧氏距离,记作 dist(p, q) .就平面情况而言,我们有 dist(p, q) = (px-qx)2+ (py-qy)2 ...
- 用strace排查故障的5种简单方法(每日一译)
原文链接:5 simple ways to troubleshoot using Strace 我很意外大部分人都不知道如何使用strace.strace一直是我的首选debug工具,因为它非常的有效 ...
- 【24.17%】【codeforces 721D】Maxim and Array
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- SAP ABAP编程 字符串加密-MD5_CALCULATE_HASH_FOR_CHAR
DATA: str1 TYPE c LENGTH 12 VALUE 'zxcv', str2 TYPE c LENGTH 32, str3 TYPE c LENGTH 32. ...
- IOS的后台执行
写在前面给大家推荐一个不错的站点 www.joblai.com 本文章由央广传媒开发部 冯宝瑞整理.哈哈 http://www.cocoachina.com/bbs/read.php? tid=14 ...
- [Node.js] Test Node RESTful API with Mocha and Chai
In this lesson, we will use Chai's request method to test our Node application's API responses.By th ...
- 小强的HTML5移动开发之路(47)——jquery mobile基本的页面框架
一.单容器页面结构 <!DOCTYPE html> <html> <head> <title>Jquery mobile 基本页面框架</titl ...
- 以Network Dataset(网络数据集)方式实现的最短路径分析
转自原文 以Network Dataset(网络数据集)方式实现的最短路径分析 构建网络有两种方式,分别是网络数据集NetworkDataset和几何网络Geometric Network,这个网络结 ...