Watchcow--POJ 2230

本文探讨了图论中的有向边欧拉回路问题,介绍了一种通过将无向边转换为有向边来求解该问题的方法,并使用Bellman-Ford算法检查是否存在负圈,最后给出了具体的C++实现代码。

1、题目类型:图论、有向边欧拉回路。

2、解题思路:题意,一个图,要将每条边恰好遍历两遍,而且要以不同的方向,还要回到原点。步骤,(1)将无向边转换为有向边,用边结构体的vector数组表示图的邻接表关系;(2)Bellman-Ford算法松弛所有的边,寻找是否存在负圈。

3、注意事项:用矩阵表示点间关系可能MLE,用点间邻接表表示可能TLE(曾经在别的题终于到过此种情况),所有改用边结构体的vector数组表示图的邻接表关系以避免上述情况。

4、参考博客:http://hi.baidu.com/lewutian/blog/item/d0e058ea9e468dded539c988.html

5、实现方法:


  
#include < iostream >
#include
< vector >
using namespace std;
#define Max 10010

struct TEdge{
int end;
bool flag;
};

TEdge tmp;
vector
< TEdge > map[Max];
int n,m;

void Euler( int x)
{
int i;
for (i = 0 ;i < map[x].size();i ++ )
{
if (map[x][i].flag == false )
{
map[x][i].flag
= true ;
Euler(map[x][i].end);
}
}
cout
<< x << endl;
}

int main()
{
int i,s,e;
cin
>> n >> m;
for (i = 0 ;i < m;i ++ )
{
cin
>> s >> e;
tmp.end
= e;
tmp.flag
= false ;
map[s].push_back(tmp);
tmp.end
= s;
tmp.flag
= false ;
map[e].push_back(tmp);
}
Euler(
1 );
return 1 ;
}

 

转载于:https://www.cnblogs.com/yongze103/archive/2010/08/12/1797948.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值