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

 

你可能感兴趣的:(poj)