图着色问题(回溯)

发布于:2025-06-06 ⋅ 阅读:(15) ⋅ 点赞:(0)
题目描述

给定无向连通图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