题目描述
给定无向连通图G=(V, E),该图有n个顶点,e条边。用m种颜色对G中的顶点着色,使得任意两个相邻顶点着色不同。输出着色后的所有可能的结果。
输入
第一行三个整数,分别表示n,e 和 m 的值。1<=n,m<=10。
下面e行,每行二个整数,表示边的两个顶点,顶点编号为0,1,2,...,n-1。
输出
如果能用m种颜色着色,输出染色后的所有可能的结果(输出顺序见样例);否则输出No solution。
样例输入 Copy
4 5 3 0 1 0 3 1 2 1 3 2 3
样例输出 Copy
1 2 1 3 1 3 1 2 2 1 2 3 2 3 2 1 3 1 3 2 3 2 3 1
#include<bits/stdc++.h>
using namespace std;
int n,e,m;
vector<vector<int>> G;
vector<int>col;
vector<vector<int>> res;
bool valid(int u,int c)
{
for(int i=0;i<G[u].size();i++)
{
if(col[G[u][i]]==c)
{
return false;
}
}return true;
}
void solve(int u)
{
if(u==n)
{
res.push_back(col);
return;
}
for(int c=1;c<=m;c++)
{
if(valid(u,c))
{
col[u]=c;
solve(u+1);
col[u]=0;
}
}
}
int main ()
{
cin>>n>>e>>m;
G.resize(n);
col.resize(n,0);
for(int i=0;i<e;i++)
{
int u,v;
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
solve(0);
if(res.empty())
{
cout<<"No solution"<<endl;
}
else
{
for(int i=0;i<res.size();i++)
{
for(int j=0;j<n;j++)
{
cout<<res[i][j]<<(j<n-1?" ":"\n");
}
}
}
return 0;
}
//by crtzk7