莫欺少年穷,修魔之旅在这开始—>算法提高课题解
思路:
1. 无向图:存在欧拉路径则所有点(除起点和终点)都是偶数点;欧拉回路:起点和终点也是偶数点
2. 先找一个有边的点,再看看有没有奇数点
3. 因为数据保证一定存在欧拉路径,所以如果不存在奇数点,则一定是欧拉回路
#include<bits/stdc++.h>
using namespace std;
const int N = 510, M = 1100;
int n=500,m;
int g[N][N];
int ans[M],cnt;
int d[N];
void dfs(int u)
{
for(int i=1;i<=n;i++)
if(g[u][i])
{
//把这条无向边删掉
g[u][i]--,g[i][u]--;
dfs(i);
}
ans[++cnt]=u;
}
int main()
{
cin>>m;
while(m--)
{
int a,b;
cin>>a>>b;
g[a][b]++,g[b][a]++;
d[a]++,d[b]++;
}
//选一个有边的点
int start=1;
while(!d[start]) start++;
//选一个奇数点,数据保证一定有欧拉路径
for(int i=1;i<=n;i++)
if(d[i]%2)
{
start=i;
break;
}
dfs(start);
for(int i=cnt;i;i--) cout<<ans[i]<<endl;
return 0;
}