求欧拉回路。
对全图进行dfs,从规定起点开始。过程中记录经过了哪些边,以保证每条边只经过一次。当一个点的所有边都遍历完成后,把该点入栈。最后依次弹栈得到的就是欧拉路径。被入栈的点都是走投无路的点,如果存在欧拉路径,第一次出现的走投无路一定是在走回到起点时,因为其他情况无论怎么走只可能略过一些边,而不可能走进死路。
本题要把每条边加为双向边。
View Code
#include#include #include #include using namespace std; #define maxn 10005 #define maxm 100005 struct Edge { int v, next; }edge[maxm]; int n, m; int head[maxn]; int ecount; bool vis[maxm]; void addedge(int a, int b) { edge[ecount].v = b; edge[ecount].next = head[a]; head[a] = ecount++; } void dfs(int a) { for (int i = head[a]; i != -1; i = edge[i].next) { if (vis[i]) continue; int v= edge[i].v; vis[i] = true; dfs(v); } printf("%d\n", a + 1); } int main() { //freopen("t.txt", "r", stdin); memset(head, -1, sizeof(head)); ecount = 0; scanf("%d%d", &n, &m); for (int i = 0; i < m; i++) { int a, b; scanf("%d%d", &a, &b); a--; b--; addedge(a, b); addedge(b, a); } memset(vis, 0, sizeof(vis)); dfs(0); return 0; }