[题解]图的m着色问题
图的m着色问题(color)
[题目描述]
给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的。图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法。
[编程任务]
对于给定的无向连通图G和m种不同的颜色,编程计算图的所有不同的着色法。
[输入格式]
第1行有3个正整数n,k 和m,表示给定的图G有n个顶点和k条边,m种颜色。顶点编号为1,2,…,n。接下来的k行中,每行有2个正整数u,v,表示图G 的一条边(u,v)。
[输出格式]
将计算出的不同的着色方案数输出。
[输入样例]
5 8 4
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5
[输出样例]
48
[解法]
此题大致思路是DFS每次确定一个点的颜色,直到确定图所有点的颜色。还有就是要会存图,通常用tu[x][y]来表示两点之间的关系,tu[x][y]=-1表示x、y两点无连接;非-1表示两点的权值或距离。我的代码中应题做了一些改变:用tu[x][y] 来表示两点之间的关系和颜色,tu[x][y]=-1表示x、y两点无连接;tu[x][y]=0表示y点没有确定颜色;tu[x][y]=k表示y点颜色为k。有了这些写代码就变得异常的简单,只需注意几个细节。
细节1:
初始化:初始值为-1,表示所有点都没有连接。
点的连接为双向的!点的连接为双向的!点的连接为双向的!
并且此时x、y都是没有确定颜色的。
细节2:
回溯时要
注意只回溯与step有连接的点!
否则回导致所有点对step都有联系
还有一定要吧step点本身排除不然会没有解,
因为不管什么时候step点的颜色都与step点的颜色一样
[代码(AC)]
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
int tu[][];
int n,k,m;
long long ans=;
void dfs(int step){
if(step>n){
++ans;
return ;
}
for(int i=;i<=m;++i){//试探每种颜色
bool flag=true;
for(int j=;j<=n;++j){
if(tu[step][j]!=-&&i==tu[step][j]){
flag=false;
break;
}
}
if(flag){
for(int j=;j<=n;++j){
if(tu[step][j]!=-&&j!=step){
tu[j][step]=i;
}
}
dfs(step+);
for(int j=;j<=n;++j){
if(tu[step][j]!=-&&j!=step){
tu[j][step]=;
}
}
}
}
}
int main(){
freopen("color.in","r",stdin);
freopen("color.out","w",stdout);
memset(tu,-,sizeof(tu));
scanf("%d%d%d",&n,&k,&m);
for(int i=;i<k;++i){
int x,y;
scanf("%d%d",&x,&y);
tu[x][y]=;
tu[y][x]=;
}
dfs();
printf("%d",ans);
return ;
}
2018-10-06 13:16:17
[题解]图的m着色问题的更多相关文章
- 【题解】图的m着色问题
题目背景 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的.图的m着色问题是对于给定图G和m ...
- 【回溯】图的m着色问题
问题 C: [回溯]图的m着色问题 时间限制: 1 Sec 内存限制: 128 MB提交: 1 解决: 1[提交][状态][讨论版] 题目描述 给定无向连通图G=(V, E)和m种不同的颜色,用这 ...
- 编程之美:1.9高效率安排见面会 图的m着色问题 回溯法
原书问题,可以转换为图的m着色问题 ,下面该问题的代码 这里有参考ppt与code,免积分载 http://download.csdn.net/detail/u011467621/6341195 // ...
- 图的M 着色问题
题目描述给定无向连通图G 和M 种不同的颜色,用这些颜色为图G 的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G 中每条边的2 个顶点着不同的颜色,则称这个图是M 可着色的.图的M 着色问题是对 ...
- P2819 图的m着色问题
题目背景 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的.图的m着色问题是对于给定图G和m ...
- 图m的着色问题(搜索)
图的m着色问题 [问题描述] 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的 ...
- 图的m着色问题 (回溯搜索)
图的m着色问题 [问题描述] 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的 ...
- 算法java实现--回溯法--图的m着色问题
(转自:http://blog.csdn.net/lican19911221/article/details/26264471) 图的m着色问题的Java实现(回溯法) 具体问题描述以及C/C++实现 ...
- 洛谷——P2819 图的m着色问题
P2819 图的m着色问题 题目背景 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的.图的 ...
随机推荐
- vue的基本指令
1.创建vue对象 <script src="vue.js"></script> var vm = new Vue({ el:"#ap ...
- 发布 ASP.NET Core 2.x 应用到 Ubuntu
简单绍一下如何将ASP.NET Core 应用发布到Linux (Ubuntu)服务器上,都是文档的东西. 服务器结构 ASP.NET Core 2.x 有两种server: HTTP.sys 只支持 ...
- Linux维护之nginx宕机,端口被占用
1.重启时错误如下 2.端口被占用,执行如下命令 [root@hwc]fuser -k /tcp 3.重启nginx服务 4.显示重启成功. 查看被占用的端口情况 netstat -tln | g ...
- The connection to the server localhost:8080 was refused - did you specify the right host or port?
The connection to the server localhost:8080 was refused - did you specify the right host or port? 解决 ...
- MySQL自定义函数与存储过程
1.前置条件 MySQL数据库中存在表user_info,其结构和数据如下: mysql> desc user_info; +-----------+----------+------+---- ...
- .NET Core 的缓存篇之MemoryCache
前言 对于缓存我们都已经很熟悉了,缓存分为很多种,浏览器缓存.试图缓存.服务器缓存.数据库缓存等等一些,那今天我们先介绍一下视图缓存和MemoryCache内存缓存的概念和用法: 视图缓存 在老的版本 ...
- 一套代码小程序&Web&Native运行的探索01
前言 前面我们对微信小程序进行了研究:[微信小程序项目实践总结]30分钟从陌生到熟悉 并且用小程序翻写了之前一个demo:[组件化开发]前端进阶篇之如何编写可维护可升级的代码 之前一直在跟业务方打交道 ...
- C++ 编译期封装-Pimpl技术
Pimpl技术——编译期封装 Pimpl 意思为“具体实现的指针”(Pointer to Implementation), 它通过一个私有的成员指针,将指针所指向的类的内部实现数据进行隐藏, 是隐藏实 ...
- C# net request payload形式发送post请求
因为开发微信群发电脑版需要模拟微信POST请求,微信发送消息使用request payload发送,实际发送的是json字符串.我们只需要生成的json字符串和请求的一致,header头完全模拟即可. ...
- C#语法——消息,MVVM的核心技术。
在C#中消息有两个指向,一个指向Message,一个指向INotify.这里主要讲INotify. INotify也有人称之为[通知],不管叫消息还是通知,都是一个意思,就是传递信息. 消息的定义 I ...