题解 CF1364D

题解 - C F 1364 D \mathrm{CF1364D}

题目意思

S o l \mathrm{Sol}

  • 我们首先先考虑第一问,我们可以通过黑白染色来完成判断,复杂度 O ( n ) O(n)

  • 对于第二问判环,我们记录每个点进入环的时间戳 i d i id_i ,如果对于两个点 ( u , v ) : k i d u i d v (u,v):k\leq id_u-id_v ,那么直接输出就可以了。对于 i d i id_i 这个我们只要用 v e c t o r vector 维护一下即可。复杂度 O ( n ) O(n)

C o d e \mathrm{Code}

#include <bits/stdc++.h>
#define For(i,a,b) for ( int i=(a);i<=(b);i++ )
#define Dow(i,b,a) for ( int i=(b);i>=(a);i-- )
#define GO(i,x) for ( int i=head[x];i;i=e[i].nex )
#define mem(x,s) memset(x,s,sizeof(x))
#define cpy(x,s) memcpy(x,s,sizeof(x))
#define YES return puts("YES"),0
#define NO return puts("NO"),0
#define GG return puts("-1"),0
#define pb push_back
using namespace std;

inline int read()
{
	int sum=0,ff=1; char ch=getchar();
	while(!isdigit(ch))
	{
		if(ch=='-') ff=-1;
		ch=getchar();
	}
	while(isdigit(ch))
		sum=sum*10+(ch^48),ch=getchar();
	return sum*ff;
}

const int mod=1e9+7;
const int mo=998244353;
const int N=1e6+5;

int n,m,vis[N],id[N],ans,s,S,C[N];
vector<int> G[N],zh,yzc[3];

inline void dfs(int u,int fa)
{
	zh.pb(u);
	id[u]=(int)zh.size();
	For(i,0,(int)G[u].size()-1)
	{
		int v=G[u][i];
		if(v==fa) continue;
		if(!id[v]) dfs(v,u);
		else 
			if(id[u]-id[v]+1<=s&&id[u]-id[v]+1>=0) 
			{
				puts("2");
				printf("%d\n",id[u]-id[v]+1);
				For(j,id[v]-1,id[u]-1) printf("%d ",zh[j]);
				exit(0);
			}
	}
   zh.pop_back();
}

inline void col(int u,int c)
{
	yzc[c].pb(u);
	C[u]=c;
	if(yzc[c].size()==S) 
	{
		puts("1");
		For(i,0,(int)yzc[c].size()-1) printf("%d ",yzc[c][i]);
		exit(0);
	}
	For(i,0,(int)G[u].size()-1)
	{
		int v=G[u][i];
		if(~C[v]) continue;
		col(v,c^1);
	}
}

int main()
{
	n=read();
	m=read();
	s=read();
	For(i,1,m) 
	{
		int x,y;
		x=read(),y=read();
		G[x].pb(y);
		G[y].pb(x);
	}
	S=(s+1)/2;
	memset(C,-1,sizeof(C));
	dfs(1,0);
	col(1,1);
	return 0;
}
	

猜你喜欢

转载自blog.csdn.net/wangyiyang2/article/details/106960749