链接:点击打开链接
题意:给出一个无向图要求每条边只能走两遍而且两次的方向必须不同,输出任意一种可能
代码:
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int N,M,cnt,ansi;
int vis[100005],ans[200005],head[100005];
struct node{
int to,next;
}G[200005];
void addedge(int u,int v){
G[cnt].to=v;
G[cnt].next=head[u];
head[u]=cnt++;
}
void dfs(int s){
int k;
for(k=head[s];k!=-1;k=G[k].next){
if(!vis[k]){
vis[k]=1;
dfs(G[k].to);
ans[ansi++]=k;
}
}
} //dfs记录欧拉回路
int main(){
int i,j,u,v;
while(scanf("%d%d",&N,&M)!=EOF){
cnt=ansi=0;
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
for(i=0;i<M;i++){
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
} //相当于双向边,但走的时候只走一条边
dfs(1);
printf("1\n");
for(i=ansi-1;i>=0;i--)
printf("%d\n",G[ans[i]].to); //输出欧拉回路
}
return 0;
}