TLE on#15求调
查看原帖
TLE on#15求调
911834
bangdeng楼主2024/7/20 21:50

这是改之前,WA on#138,后来发现应该先找最小环

#include<bits/stdc++.h>
#define int long long
#define re register
using namespace std;
const int N=4e6+10;
int n,m,k,dep[N],h[N],fa[N];
int e[N],ne[N],id;
bool vis[N];
void add(int a,int b)
{
	e[++id]=b;
	ne[id]=h[a];
	h[a]=id;
}
void dfs(int u)
{
	vis[u]=1;
	dep[u]=dep[fa[u]]+1;
	for(int i=h[u];i;i=ne[i])
	{
		int v=e[i];
		if(v==fa[u])continue;
		if(vis[v])
		{
			if(dep[u]-dep[v]<k)
			{
				puts("2");
				printf("%lld\n",dep[u]-dep[v]+1);
				for(int j=u;j!=fa[v];j=fa[j])printf("%lld ",j);
				exit(0);
			}
			else
			{
				puts("1");
				for(int j=u,flag=1;flag<=k&&j!=fa[v];j=fa[j],flag++)if(flag&1)printf("%lld ",j);
				exit(0);
			}
		}
		else
		{
			fa[v]=u;
			dfs(v);
		}
	}
	vis[u]=0;
}
int num[2];
void dfs1(int u,bool flag=1)
{
	++num[flag];
	for(int i=h[u];i;i=ne[i])
	{
		int v=e[i];
		if(v==fa[u])continue;
		dfs1(v,flag^1);
	}
}
int tim;
void dfs2(int u,bool flag)
{
	if(flag)
	{
		printf("%lld ",u);
		++tim;
		if(tim==ceil(k/2.))exit(0);
	}
	for(int i=h[u];i;i=ne[i])
	{
		int v=e[i];
		if(v==fa[u])continue;
		dfs2(v,flag^1);
	}
}
signed main()
{
	scanf("%lld%lld%lld",&n,&m,&k);
	int u,v;
	while(m--)
	{
		scanf("%lld%lld",&u,&v);
		add(u,v);
		add(v,u);
	}
	dfs(1);
	puts("1");
	dfs1(1);
	dfs2(1,num[1]>num[0]);
}

这是改完之后

#include<bits/stdc++.h>
#define re register
using namespace std;
const int N=4e6+10;
int n,m,k,dep[N],h[N],fa[N];
int e[N],ne[N],id;
bool vis[N];
void add(int a,int b)
{
	e[++id]=b;
	ne[id]=h[a];
	h[a]=id;
}
int x;
void dfs(int u)
{
	vis[u]=1;
	dep[u]=dep[fa[u]]+1;
	for(int i=h[u];i;i=ne[i])
	{
		int v=e[i];
		if(v==fa[u])continue;
		if(vis[v])
		{
			if(dep[u]-dep[v]<k)
			{
				puts("2");
				printf("%d\n",dep[u]-dep[v]+1);
				for(int j=u;j!=fa[v];j=fa[j])printf("%d ",j);
				exit(0);
			}
			else x=u;
		}
		else
		{
			fa[v]=u;
			dfs(v);
		}
	}
	vis[u]=0;
}
int num[2];
void dfs1(int u,bool flag=1)
{
	++num[flag];
	for(int i=h[u];i;i=ne[i])
	{
		int v=e[i];
		if(v==fa[u])continue;
		dfs1(v,flag^1);
	}
}
int tim;
void dfs2(int u,bool flag)
{
	if(flag)
	{
		printf("%d ",u);
		++tim;
		if(tim==ceil(k/2.))exit(0);
	}
	for(int i=h[u];i;i=ne[i])
	{
		int v=e[i];
		if(v==fa[u])continue;
		dfs2(v,flag^1);
	}
}
signed main()
{
	scanf("%d%d%d",&n,&m,&k);
	int u,v;
	while(m--)
	{
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	dfs(1);
	if(x)
	{
		puts("1");
		for(int j=0;j<k;x=fa[fa[x]],j+=2)printf("%d ",x);
		exit(0);
	}
	puts("1");
	dfs1(1);
	dfs2(1,num[1]>num[0]);
}

改完就T了

2024/7/20 21:50
加载中...