跟poj1515有点像 不过不是改动一点就能成的,这个题遇到单向边是不改动的,只是把以下几种情况中的边输出:
1) 第一次深搜时把所有有向边都当成无向边,这时候求出的桥必须双向都输出(当然了,一种给的数据一定也是双向的)
2)第二次深搜时输出这三种:
1)之前没遍历过:
发现是双向的边 而且是桥 ==>输出相反的顺序(因为双连通分量必须内部相互可达,所以一定没有桥,遇到桥了,说明走反了)
发现是双向的边 而且不是桥==>就按着这个顺序顺出
2)之前遍历过:而且是双向的 直接按着这个顺序输出就好
WA了一次居然因为少一个换行==
/**********
poj1438
2015.11.23
8088K 688MS C++ 2465B
**********/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int maxn=2000+10;
const int maxm=maxn*maxn;
int pre[maxn];
int dfs_clock,n,m;
bool mz[maxn][maxn],flag[maxn][maxn];
void Init()
{
memset(flag,0,sizeof(flag));
memset(mz,0,sizeof(mz));
memset(pre,0,sizeof(pre));
dfs_clock=0;
}
void AddEdge(int u,int v,bool f)
{
mz[u][v]=true;
flag[u][v]=f;
}
int Tarjan(int u,int fa)
{
int lowu=pre[u]=++dfs_clock;
for(int i=1;i<=n;i++)
{
int v=i;
if(!flag[u][v]||(v==fa)) continue;
if(!pre[v])
{
int lowv=Tarjan(v,u);
lowu=min(lowu,lowv);
if(lowv>pre[u])
{
printf("%d %d 2\n",u,v);
flag[u][v]=false;flag[v][u]=false;
continue;
}
}
else lowu=min(lowu,pre[v]); //之前访问过了,所以用反向边更新自己
}
return lowu;
}
int dfs(int u,int fa)
{
int lowu=pre[u]=++dfs_clock;
for(int i=1;i<=n;i++)
{
int v=i;
if(!flag[u][v]||(v==fa)) continue;
if(!pre[v])
{
int lowv=dfs(v,u);
lowu=min(lowu,lowv);
if(flag[v][u])
{
if(lowv>pre[u])
{
printf("%d %d 1\n",v,u);
flag[u][v]=false;flag[v][u]=false;
}
else
{
printf("%d %d 1\n",u,v);
flag[u][v]=false;flag[v][u]=false;
}
}
}
else {
lowu=min(lowu,pre[v]); //之前访问过了,所以用反向边更新自己
if(flag[v][u])
{
printf("%d %d 1\n",u,v);
flag[u][v]=false;
}
}
}
return lowu;
}
int main()
{
//freopen("cin.txt","r",stdin);
//freopen("out.txt","w",stdout);
int u,v,type;
scanf("%d%d",&n,&m);
Init();
for(int i=0;i<m;++i)
{
scanf("%d%d%d",&u,&v,&type);
AddEdge(u,v,true);
AddEdge(v,u,type==2);
}
Tarjan(1,-1);
memset(pre,0,sizeof(pre));
dfs_clock=0;
for(int i=1;i<=n;++i)
{
if(!pre[i])
dfs(i,-1);
}
return 0;
}