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;
}
时间: 2024-11-07 23:59:29

POJ 1438 One-way Traffic的相关文章

POJ - 1438 One-way Traffic(混合图改有向图)

题目大意:给出一张混合图,要求你改变尽量多的双向边,使得改变后的图还是强连通的 解题思路:这题和poj-1515类似,只不过这题是混合题,大体思路还是差不多的,在dfs的时候记录一下桥和使用的是哪些边即可 #include <cstdio> #include <cstring> #define min(a,b)((a) < (b) ? (a) : (b)) #define N 2010 #define M 4000010 struct Edge{ int from, to,

TRAFFIC LIGHTS POJ 1158

题目大意: 在Dingilville 城市安排是一种不同寻常的方式,每个交叉路口有一条道路连接,一条道路最多连接两个不同的交叉路口.每个交叉路口不能连接他自己.道路旅行一端到另一端的时间是相同的,任何一个交叉路口都有一个红绿灯,它在任意时刻只能有红色或者绿色.当且仅当两个交叉路口的灯的颜色一样的时候才允许从一个交叉路口到达另一个交叉路口.如果一辆车到达一个交叉路口的时候这个灯刚好转换,那么它必须考虑这个灯的颜色.允许车辆在交叉路口等待. 给你这个城市的地图如下: 所有道路的通过时间是整数,每个交

POJ 2225 / ZOJ 1438 / UVA 1438 Asteroids --三维凸包,求多面体重心

题意: 两个凸多面体,可以任意摆放,最多贴着,问他们重心的最短距离. 解法: 由于给出的是凸多面体,先构出两个三维凸包,再求其重心,求重心仿照求三角形重心的方式,然后再求两个多面体的重心到每个多面体的各个面的最短距离,然后最短距离相加即为答案,因为显然贴着最优. 求三角形重心见此: http://www.cnblogs.com/whatbeg/p/4234518.html 代码:(模板借鉴网上模板) #include <iostream> #include <cstdio> #in

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i

POJ百道水题列表

以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight Moves1101 Gamblers1204 Additive equations 1221 Risk1230 Legendary Pokemon1249 Pushing Boxes 1364 Machine Schedule1368 BOAT1406 Jungle Roads1411 Annive

[POJ 2420] A Star not a Tree?

A Star not a Tree? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4058   Accepted: 2005 Description Luke wants to upgrade his home computer network from 10mbs to 100mbs. His existing network uses 10base2 (coaxial) cables that allow you

POJ 3311 Hie with the Pie (Floyd + 状压dp 简单TSP问题)

Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5019   Accepted: 2673 Description The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possible. Unfortunately, due to cutbacks, they can affo

POJ 2420 模拟退火法

A Star not a Tree? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3272   Accepted: 1664 Description Luke wants to upgrade his home computer network from 10mbs to 100mbs. His existing network uses 10base2 (coaxial) cables that allow you

【POJ 2420】A Star not a Tree?

A Star not a Tree? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3929   Accepted: 1952 Description Luke wants to upgrade his home computer network from 10mbs to 100mbs. His existing network uses 10base2 (coaxial) cables that allow you