191114-旅行

旅行

题目描述

简化题意:从起点1开始遍历完所有点,使字典序最小,求该字典序(每条边至多经过两次,进入一次,回溯一次)

解析

首先考虑是一棵树的情况,显然只需要将每个点连出的边按从大到小拍一遍序,因此dfs时一定会先走编号小的城市,因此排完序过后,直接输出dfs序即可

接着再来考虑基环树的情况,暴力删边!!!,因为尽管是一棵基环树,但是最后遍历过后,遍历的路径仍然是一棵树,即有一条边一定不会遍历到,因此枚举删掉的边,然后按照第一种情况瞎搞就好了。

至于加强版的数据,就应该在环上枚举断边,再操作

代码

#include<bits/stdc++.h>
#include<iostream>
#define M 5009
using namespace std;
const int ff=1e5+1;
const int inf=1e9+1;
int nxt[M*2],tot,to[M*2],w[M*2],first[M],n,m,cnt,b[M],ans[M];
bool vis[M],bj[M][M],bjj;
int st[ff],ed[ff];
int read(){
	int f=1,re=0;
	char ch;
	for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
	if(ch=='-'){
		f=-1;
		ch=getchar();
	}
	for(;isdigit(ch);ch=getchar())
		re=(re<<3)+(re<<1)+ch-'0';
	return re*f;
}
void add1(int x,int y){
	nxt[++tot]=first[x];
	first[x]=tot;
	to[tot]=y;
}
void dfs1(int r)
{
	printf("%d ",r);
	for(int i=first[r];i;i=nxt[i])
	{
		int u=to[i];
		if(vis[u]) continue;
		vis[u]=1;
		dfs1(u);	
	}
}
int zhan[ff],top;
int ban[5001][5001];
int check()
{
	if(top<n)
		return 0;
	for(int i=1;i<=n;++i)
	{
		if(zhan[i]<ans[i])
			return 1;
		if(zhan[i]>ans[i])
			return 0;
	}
}
void copy()
{
	for(int i=1;i<=n;++i)
		ans[i]=zhan[i];
}
int tag[ff];
void dfs2(int r,int las)
{
	zhan[++top]=r;tag[r]=1;
	for(int i=first[r];i;i=nxt[i])
	{
		int u=to[i];
		if(u==las) continue;
		if(ban[r][u]||ban[u][r]||tag[u])
			continue;
		vis[u]=1;
		dfs2(u,r);	
	}
}
int main(){
	n=read(),m=read();
	if(m==n-1){
		int x,y;
		for(int i=1;i<=m;i++){
			x=read(),y=read();
			bj[x][y]=1;
			bj[y][x]=1;
		}
		for(int i=1;i<=n;i++)
			for(int j=n;j>=1;j--)
				if(bj[i][j]) add1(i,j);
		vis[1]=1;
		dfs1(1);
		return 0;
	}
	else
	{
		for(int i=1;i<=m;i++)
		{
			int x,y;
			x=read(),y=read();
			st[i]=x;ed[i]=y;
			bj[x][y]=1;
			bj[y][x]=1;
		}
		for(int i=1;i<=n;i++)
			for(int j=n;j>=1;j--)
				if(bj[i][j]) add1(i,j);
		for(int i=1;i<=n;++i)
			ans[i]=inf;
		for(int i=1;i<=m;++i)
		{
			memset(tag,0,sizeof(tag));
			top=0;
			ban[st[i-1]][ed[i-1]]=ban[ed[i-1]][st[i-1]]=0;
			ban[st[i]][ed[i]]=ban[ed[i]][st[i]]=1;
			dfs2(1,0);
			if(check()) copy();
		}
		for(int i=1;i<=n;++i)
			cout<<ans[i]<<" ";
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值