社区讨论

萌新求助

P5022[NOIP 2018 提高组] 旅行参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi7pyzap
此快照首次捕获于
2025/11/21 01:42
4 个月前
此快照最后确认于
2025/11/21 01:42
4 个月前
查看原帖
最后三个点(#23,#24,#25TLE

评测记录

思路跟第一篇题解一样,暴力删边,O(n2)\text{O}(n^{2})
下面是我的代码~~(既没注释,码风又混乱)~~:
压行严重\color{white}\text{压行严重}
CPP
#include<cstdio>
#include<cstring>
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
static char buf[100000],*p1=buf,*p2=buf;

inline unsigned int read(void){
	register char ch=getchar();
	register unsigned int sum=0;
	while(!(ch>='0'&&ch<='9'))ch=getchar();
	while(ch>='0'&&ch<='9')sum=(sum<<1)+(sum<<3)+ch-48,ch=getchar();
	return sum;
}

struct vector{
	#define Max_Size 5001
	unsigned int Size,num[Max_Size];
	#undef Max_Size
	void push_back(unsigned int x){
		num[Size++]=x;
		return;
	}
	unsigned int* begin(void){
		return num;
	}
	unsigned int* end(void){
		return num+Size;
	}
	unsigned int size(void){
		return Size;
	}
	unsigned int operator[](unsigned int x){
		return num[x];
	}
};

bool vis[5001];
unsigned int n,m,cnt,ans[5001],k[5001],dep,x,y,From[10001],To[10001],temp[5001];
vector vec[5001];

inline void Change(void);
inline void Add_Edge(unsigned int,unsigned int);
inline void DFS_Tree(unsigned int,unsigned int);
inline void DFS_Graph(unsigned int,unsigned int);
inline void Merge_Sort(unsigned int a[],unsigned int l,unsigned int r);
inline bool isLess(void);

int main(void){
	register unsigned int i,u,v;
	for(n=read(),m=read(),i=1;(i<=m)&&(u=read(),v=read(),Add_Edge(u,v),Add_Edge(v,u),vec[u].push_back((unsigned int)v),vec[v].push_back((unsigned int)u),true);++i);
	for(i=1;(i<=n)&&(Merge_Sort(vec[i].num,0,vec[i].Size-1),true);++i);
	if(n==m){
		for(i=1;(i<=cnt)&&((dep=0,x=From[i],y=To[i],memset(vis,0,sizeof(vis)),DFS_Graph(1,0)),(dep<n)?0:((ans[1]==0||isLess())?(Change(),0):0),true);i+=2);
		for(i=1;(i<=n)&&(printf("%u ",ans[i]),true);++i);
	}
	else
		for(i=1,DFS_Tree(1,0);(i<=n)&&(printf("%u ",ans[i]),true);++i);
	putchar('\n');
	return 0;
}

inline void Change(void){
	register unsigned int i;
	for(i=1;(i<=n)&&(ans[i]=k[i],true);++i);
	return;
}

inline void Add_Edge(unsigned int u,unsigned int v){
	From[++cnt]=u,To[cnt]=v;
	return;
}

inline void DFS_Tree(unsigned int u,unsigned int fa){
	if(vis[u])
		return;
	register unsigned int i;
	for(i=0,vis[ans[++dep]=u]=true;(i<vec[u].size())&&((vec[u][i]!=fa)?(DFS_Tree(vec[u][i],u),0):0,true);++i);
	return;
}

inline void DFS_Graph(unsigned int u,unsigned int fa){
	if(vis[u])
		return;
	register unsigned int i;
	for(i=0,vis[k[++dep]=u]=true;(i<vec[u].size())&&((((vec[u][i]==fa)||((vec[u][i]==y&&u==x)||(vec[u][i]==x&&u==y)))?(0):(DFS_Graph(vec[u][i],u),0),true));++i);
	return;
}

void Merge_Sort(unsigned int a[],unsigned int l,unsigned int r){
	if(l>=r)
		return;
	Merge_Sort(a,l,(l+r)>>1),Merge_Sort(a,((l+r)>>1)+1,r);
	register unsigned int i=l,j=((l+r)>>1)+1,k=l,mid=(l+r)>>1;
	while(i<=mid&&j<=r)
		if(a[i]<=a[j])
			temp[k++]=a[i++];
		else
			temp[k++]=a[j++];
	while(i<=mid)
		temp[k++]=a[i++];
	while(j<=r)
		temp[k++]=a[j++];
	for(i=l;i<=r;++i)
		a[i]=temp[i];
	return;
}

inline bool isLess(void){
	register unsigned int i;
	for(i=1;i<=n;++i)
		if(k[i]==ans[i])
			continue;
		else
			return k[i]<ans[i];
	return false;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...