社区讨论
萌新求助
P5022[NOIP 2018 提高组] 旅行参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mi7pyzap
- 此快照首次捕获于
- 2025/11/21 01:42 4 个月前
- 此快照最后确认于
- 2025/11/21 01:42 4 个月前
最后三个点(
#23,#24,#25)TLE。评测记录
思路跟第一篇题解一样,暴力删边,。
下面是我的代码~~(既没注释,码风又混乱)~~:
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 条回复,欢迎继续交流。
正在加载回复...