博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ-1129 Channel Allocation DFS搜索
阅读量:5011 次
发布时间:2019-06-12

本文共 1802 字,大约阅读时间需要 6 分钟。

题意:给定一张图,现在对这张图进行染色,且相邻的两个点的颜色不能够相同,问最少要用多少种颜色?

思路:有一下贪心思路,对于没一个节点,我们对其周围的结点进行遍历,对有颜色的邻节点的颜色进行统计,选取一种编号最靠前且不与周边颜色冲突的颜色对改点进行涂色。由

     于我们的涂色都是按编号从小到大因此该策略下能够产生最小的颜色集合。可以简单的证明下:假设现有N个点,对部分点已经进行了涂色,且满足条件,现在问题就是我们
   的算法在要添加一种新颜色的时候还在用以前的颜色,导致后面出现了更多的颜色开销(违背贪心规则,如果确实这样的话,此题则变为动态规划求解),但是我们得出的推
     论是,如果一个点应该被涂上新的颜色的话,那么我们可以通过在改点涂上一个已有的颜色,再将其相邻的结点涂上一种新颜色(同样也是增加了一种颜色)来达到同样的效
     果。因此我们的算法是正确的。

代码如下:

#include 
#include
#include
#include
using namespace std;int N, G[30][30], color[30], ret[30];void dfs(int x) { int c[30] = {
0}; for (int i = 0; i < N; ++i) { if (G[x][i]) { c[color[i]] = 1; // 如果孩子没有染色的话就直接选定 } } for (int i = 1; i <= N; ++i) { if (!c[i]) { color[x] = i; if (!ret[i]) { ret[i] = 1; } break; } } for (int i = 0; i < N; ++i) { if (!color[i]) { dfs(i); } } return;}int main() { char rela[30]; int len; while (scanf("%d", &N), N != 0) { memset(G, 0, sizeof (G)); memset(color, 0, sizeof (color)); memset(ret, 0, sizeof (ret)); for (int i = 0; i < N; ++i) { scanf("%s", rela); len = strlen(rela); for (int j = 2; j < len; ++j) { G[i][rela[j]-'A'] = 1; } // 标号为0 - N-1 } dfs(0); int cnt = 0; for (int i = 1; i <= N; ++i) { if (ret[i]) { ++cnt; } } printf("%d", cnt); if (cnt == 1) { printf(" channel needed.\n"); } else { printf(" channels needed.\n"); } } return 0;}

转载于:https://www.cnblogs.com/Lyush/archive/2012/11/20/2779670.html

你可能感兴趣的文章
已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中。
查看>>
MySQL的随机数函数rand()的使用技巧
查看>>
thymeleaf+bootstrap,onclick传参实现模态框中遇到的错误
查看>>
python字符串实战
查看>>
wyh的物品(二分)
查看>>
12: xlrd 处理Excel文件
查看>>
综合练习:词频统计
查看>>
中文url编码乱码问题归纳整理一
查看>>
Cesium应用篇:3控件(3)SelectionIndicator& InfoBox
查看>>
58. Length of Last Word(js)
查看>>
前端面试题汇总(持续更新...)
查看>>
如何成为F1车手?
查看>>
QT自定义消息
查看>>
Save (Not Permitted) Dialog Box
查看>>
装饰模式(Decorator)
查看>>
任务13:在Core Mvc中使用Options
查看>>
利用Excel 2010数据透视图实现数字的可视化的图形直观展示
查看>>
Sort Colors
查看>>
iview树的修改某个节点,树刷新后自动展开你刚才展开的所有节点
查看>>
oracle服务起不来以及无法监听问题解决
查看>>