2039 骑马修栅栏 (欧拉回路)

 他说要都走一遍而且不走重复,那就是找一个欧拉回路;

不会欧拉回路的话应该先看一下欧拉回路的概念

这里让找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;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值