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