注意是有向图
vector存图
<pre name="code" class="cpp">#include<cstdio>//图联通 并且有2个或者没有奇数度节点,没有的是欧拉回路
#include<cstdlib>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e6+10;
struct Edge
{
int from,to;
}z;
vector<Edge> w;
vector<int> s[maxn];
int path[maxn],cont,vis[maxn];
void add_edge(int from,int to)
{
z.from=from;
z.to=to;
w.push_back(z);
int m=w.size()-1;
s[from].push_back(m);
s[to].push_back(m);
}
int dfs(int x)
{
for(int i=0; i<s[x].size(); i++)
{
int p=s[x][i];
if(vis[p]) continue;
vis[p]=1;
int y=w[p].to;
dfs(x==y?w[p].from:y);
}
path[++cont]=x;
}
int x[maxn];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
memset(x,0,sizeof(x));
memset(vis,0,sizeof(vis));
w.clear();
for(int i=0; i<=10000; i++)
s[i].clear();
for(int i=0; i<m; i++)
{
int a,b;
scanf("%d%d",&a,&b);
add_edge(a,b);
x[a]++;
x[b]++;
}
cont=0;
int k=1;
for(int i=1; i<=n; i++)
{
if(x[i]%2)
{
k=i;
break;
}
}
dfs(k);
for(int i=cont;i>=1;i--)
printf("%d%c",path[i],i==1?'\n':' ');
}
}
临接矩阵存图
#include<cstdio>//图联通 并且有2个或者没有奇数度节点,没有的是欧拉回路
#include<cstdlib>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e6+10;
int path[maxn],cont;
int x[1010][1010],n;
void dfs(int s)
{
for(int i=1;i<=n;i++)
{
if(x[s][i]>0)
{
x[s][i]--;
x[i][s]--;
dfs(i);
}
}
path[++cont]=s;
}
int sum[maxn];
int main()
{
int m;
while(~scanf("%d%d",&n,&m))
{
memset(sum,0,sizeof(sum));
memset(x,0,sizeof(x));
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
x[a][b]++;
x[b][a]++;
sum[a]++;
sum[b]++;
}
int k=1;
for(int i=1;i<=n;i++)
{
if(sum[i]%2)
{
k=i;
break;
}
}
cont=0;
dfs(k);
for(int i=cont;i>=1;i--)
printf("%d%c",path[i],i==1?'\n':' ');
}
}