Watchcow--POJ 2230

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;
}

 

posted @ 2010-08-12 11:17  勇泽  阅读(322)  评论(0编辑  收藏  举报