[bzoj4878][DFS]挑战NP-Hard

版权声明:蒻蒟的bolg... https://blog.csdn.net/Rose_max/article/details/85594794

Description

天才大学生quailty热衷于解决NP-Hard问题,你如果AC 了这道题,就可以成为他真正的粉丝。图染色问题:给定
无向图G和一个正整数k。对于图中的每个点,选择一个在[1,k]之间的整数作为其颜色。你需要保证对于每条边,
其两端点的颜色均不相同。简单k路径问题:给定无向图G和一个正整数k。请找到一条经过了恰好k条边的简单路径
。即,你需要找到一个长度为k+1的序列v_1,v_2,…,v_{k+1},满足1<=v_i<=n,且任意两个v均不相同,同时v_i
与v_{i+1}之间存在一条边。现在给定无向图G和一个正整数k,quailty知道你没有他的水平,所以你只需解决上面
的任意一个问题就可以成为他的粉丝。

Input

第一行包含一个正整数T(1<=T<=1000),表示测试数据的组数。
对于每组数据,第一行包含三个正整数n,m,k(1<=n<=1000,1<=m<=10000,1<=k<=n),分别表示图的点数与边数。
接下来m行,每行两个正整数a,b(1<=a,b<=n),表示a到b之间存在一条无向边。
输入数据保证不存在重边与自环,且总边数不超过100000。

Output

对于每组数据: 若选择了图染色问题,请输出“color”,然后输出n个在1到k之间的正整数,分别表示每个点的颜色。
若选择了简单路径问题,请输出“path”,然后输出k+1个在1到n之间的正整数,分别表示路径上每个点的编号。 若有多组可行解,输出任意一组。

Sample Input

2

4 5 2

1 2

2 3

3 4

4 1

1 3

3 3 3

1 2

2 3

3 1

Sample Output

path 3 2 1

color 1 2 3

题解

有点东西…
我们需要注意到一个东西:在无向图的DFS树上是只存在有返祖边而不存在有横插边的
对这个图做出DFS树
显然如果深度>=K的话我们总可以找到一条长度为K的路径
否则把点的颜色设为深度就好了
因为同层的不会有边,有边的只会在异层中出现
注意图可能不联通

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<ctime>
#include<map>
#include<bitset>
#include<set>
#define LL long long
#define mp(x,y) make_pair(x,y)
#define pll pair<long long,long long>
#define pii pair<int,int>
using namespace std;
inline int read()
{
	int f=1,x=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int stack[20];
inline void write(LL x)
{
	if(x<0){putchar('-');x=-x;}
    if(!x){putchar('0');return;}
    int top=0;
    while(x)stack[++top]=x%10,x/=10;
    while(top)putchar(stack[top--]+'0');
}
inline void pr1(int x){write(x);putchar(' ');}
inline void pr2(LL x){write(x);putchar('\n');}
const int MAXN=1005;
const int MAXM=20005;
struct node{int x,y,next;}a[MAXM];int len,last[MAXN];
void ins(int x,int y){len++;a[len].x=x;a[len].y=y;a[len].next=last[x];last[x]=len;}
int vis[MAXN],dep[MAXN],fa[MAXN];
int n,m,K;
void dfs(int x)
{
	vis[x]=1;
	for(int k=last[x];k;k=a[k].next)
	{
		int y=a[k].y;
		if(!vis[y])dep[y]=dep[x]+1,fa[y]=x,dfs(y);
	}
}
int main()
{
	int T=read();while(T--)
	{
		n=read();m=read();K=read();
		len=0;memset(last,0,sizeof(last));
		for(int i=1;i<=m;i++)
		{
			int x=read(),y=read();
			ins(x,y);ins(y,x);
		}
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=n;i++)if(!vis[i])dep[i]=0,dfs(i);
		int mx=0;
		for(int i=1;i<=n;i++)mx=max(mx,dep[i]);
		if(mx>=K)
		{
			printf("path ");
			int u=-1;
			for(int i=1;i<=n;i++)if(dep[i]>=K){u=i;break;}
			while(K--)pr1(u),u=fa[u];
			pr2(u);
		}
		else
		{
			printf("color ");
			for(int i=1;i<n;i++)pr1(dep[i]+1);
			pr2(dep[n]+1);
		}
	}
	return 0;
}


猜你喜欢

转载自blog.csdn.net/Rose_max/article/details/85594794
今日推荐