思路:很显然是一个欧拉无向图。
因为要遍历每个边两遍而且方向不同。
所以可以看成是有向图来处理。
以下代码是 dfs+邻接表。
这里注意的dfs和普通的dfs不一样在于终止条件。
以前的dfs都是找到某个点后终止,现在是直到遇到某个点,那个点已经无路可走了,再终止。(因为题目已经保证要求的路径存在)
还有就是有些人估计疑惑为什么没用到栈来输出。
其实不用栈的原因很简单,就是欧拉回路的路径是对称。起点终点都是1,你从终点走过来和从起点走过来都是符合题意。
第一次接触欧拉图,还有这题算简单的,一次AC水过。
#include<iostream>
using namespace std;
const int N=10005;
const int M=50005;
int n,m;
int k=1;
struct Edge
{
int v,next,re;
bool vis;
}edge[2*M];
int edgehead[N];
void addedge(int from,int to)
{
edge[k].v=to;
edge[k].next=edgehead[from];
edge[k].vis=0;
edge[k].re=k+1;
edgehead[from]=k;
k++;
edge[k].v=from;
edge[k].vis=0;
edge[k].re=k-1;
edge[k].next=edgehead[to];
edgehead[to]=k;
k++;
}
void dfs(int now)
{
for(int i=edgehead[now];i;i=edge[i].next)
{
if(!edge[i].vis)//这个深搜的终止条件是每个边都结束了。
{
edge[i].vis=true;
dfs(edge[i].v);
}
}
printf("%d\n",now);
}
void solve()
{
dfs(1);