感觉自己好久不做这类题,脑子都有点抽了!
这里放一道很有意思的题:
链接戳这里☞
下面是代码和详细注释:有兴趣的可以看一下!
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
bool mp[1505][1505];//存边
int m,n,step[1505],num[1505],right;//分别是n:点个数;m:边个数;step:步数; num:记录存边时每一个点的已存边数;
//right:记录起始偶点;
bool judge();//判定奇偶点个数函数
void dfs(int v,int st,int begin)//对边进行深度搜索 v:当前点位置;st:步数;begin:起点
{
if(st==m)// 如果步数和边数一样了! 输出答案!
{
printf("%d",begin);
for(int i=0;i<st;++i)
{
printf(" %d",step[i]);
}
exit(0);//退出程序,在cstdlib中
}
for(int i=1;i<=n;++i)
{
if(mp[v][i])//若有边没有被走过
{
mp[v][i]=false;//走过这条边
mp[i][v]=false;//同上
step[st]=i;//进行标记走过的点
dfs(i,st+1,begin);
mp[v][i]=true;//如果退回,则取消标记走过这条边
mp[i][v]=true;//同上
}
}
}
int main()
{
scanf("%d%d",&n,&m);//n point m line
int a,b;
for(int i=1;i<=m;++i)//读入
{
scanf("%d%d",&a,&b);
mp[a][b]=true;
num[a]++;//☣
mp[b][a]=true;
num[b]++;
}
if(judge())
{
dfs(right,0,right);
}
else
dfs(1,0,1);//若没有奇点,则直接从1点开始遍历!
}
bool judge()//判断有无奇偶点,进行起点选择!
{
int left=0;
for(int i=1;i<=n;++i)
{
if(num[i]%2==1)
{
right=i;
left++;
}
}
if(left==2)
return true;
else
return false;
}