传送门
题意:给出n条线,判断是否可以组成欧拉回路,如果可以,输出其中的一种欧拉回路;
分析:无向欧拉回路:所有顶点都有偶数的度;输入点的过程中,记录起点终点的度数,同时正向反向边都加1,没有必要找孤立点;输出有多种可能,随便以路径中的一个点开始都可以,使用深搜;保证第一个和最后一个一定是相连的:只要度数都是偶数,就一定符合欧拉回路,所以肯定能回到第一个;
ac代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int book[60],vis[60][60],f[60];
void dfs(int u)
{
int v;
for(v=1;v<=50;v++)
if(vis[u][v])//如果起点和遍历点相连
{
vis[u][v]--;//无向图,两个点都有可能,所以两个方向都要标记!
vis[v][u]--;
dfs(v);
printf("%d %d\n",v,u);//保持第一条路的终点与下一条路的起点一致;
}
}
int main()
{
int t,g,n,flag,i,j,u,v;
scanf("%d",&t);
g=1;
while(t--)
{
memset(book,0,sizeof(book));
memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&u,&v);
book[u]++,book[v]++;
vis[u][v]++,vis[v][u]++;//无向图标记
//merge(u,v);
}
flag=0;
for(i=1;i<=50;i++)
if(book[i]%2!=0)//如果度数为奇数
{
flag=1;
break;
}
printf("Case #%d\n",g++);
if(flag)
printf("some beads may be lost\n");
else
{
dfs(u);
}
if(t)
printf("\n");
}
}