K - Assigning Frequencies
题意:一张图,一些边,用三个颜色染色,使得相邻点不同色,判断是否存在方案。
思路:类似于染色法判断二分图,但是不能用经典的染色方案,这个题可以Dfs暴力枚举出每一种方案,每一种方案都遍历之前的结点,看是否存在与当前节点同色的点,如果存在则返回false,如果递归到第n个点还没有return false则表明存在方案。
如果搜到合法方案就不再搜了,直接返回 true .
#include <iostream>
#include <cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,t,m;
int g[N][N];
int col[N];
int flag;
bool dfs(int x)
{
for(int i=0; i<x; i++)
{
if(g[x][i]&&col[x]==col[i])
{
flag=0;
return false;
}
}
if(x==n-1) return true;
for(int i=0; i<3; i++)
{
col[x+1]=i;
if(dfs(x+1)) return true;
}
return false;
}
signed main()
{
cin>>t;
while(t--)
{
memset(g,0,sizeof g);
cin>>n>>m;
while(m--)
{
int u,v;
cin>>u>>v;
g[u][v]=1;
g[v][u]=1;
}
bool flag=true;
flag=dfs(0);
if(flag)cout<<"Y"<<endl;
else cout<<"N"<<endl;
}
return 0;
}