他说要都走一遍而且不走重复,那就是找一个欧拉回路;
不会欧拉回路的话应该先看一下欧拉回路的概念
这里让找500进制最小的,无非就是字典序最小的欧拉回路,并且因为这个题点的大小最多是500,所以用矩阵存储,遍历的时候根据循环会从小到大依次寻找。
具体事项代码里说明
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int d[1010],ans[1010],map[1010][1010],n,cnt=0,max1=0;
void dfs(int v){
for(int i=1;i<=max1;i++){//从1寻找到最大值的点max1//这里也是因为矩阵存储,所以会从小到大寻找
if(map[v][i]>0){
map[v][i]--;
map[i][v]--;
dfs(i);
}
}
cnt++;//因为最后找的点在dfs里最先出来,所以我们记录下来dfs出来的值倒序输出
ans[cnt]=v;
}
int main(){
cin>>n;
int u,v;
for(int i=1;i<=n;i++){
cin>>u>>v;
map[u][v]++;//因为可能他给你好多栅栏的两侧都是同一组点,比如说给你三组数据:1 2 < 2 1 <1 2 那么就有三个栅栏,所以按照边数记录一共多少个点;
map[v][u]++;
d[u]++;//记录u连着几条边
d[v]++;//记录v连着几条边
max1=max(max(max1,u),v);//记录点的最大值;
}
int find=0;
for(int i=1;i<=max1;i++)//!!一定注意要从1寻找到最大的点而不是寻找到n //也是因为用矩阵存储,所以会从小到大寻找
if(d[i]%2==1){//如果有边数为奇数的点,那么就从最小的那个奇数点开始找
find=i;
break;
}
if(find==0){
for(int i=1;i<=max1;i++)
if(d[i]>0){//如果没有奇数点从最小的有边的点开始dfs
find=i;
break;
}
}
dfs(find);
for(int i=cnt;i>=1;i--)//因为最后找的点在dfs里最先出来,所以我们记录下来dfs出来的值倒序输出
cout<<ans[i]<<endl;
}