题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=84
题目大意:根据读取的转发器网络的描述信息,求出所需频道的最小使用量
这题用到了“四色定理” : 任何一张地图只用四种颜色就能使具有共同边界的国家着上不同的颜色。这里所指的相邻区域,是指有一整段边界是公共的。如果两个区域只相遇于一点或有限多点,就不叫相邻的。因为用相同的颜色给它们着色不会引起混淆。
算法分析:本题的转发器网络相当于一个无向图,临近的转发器使用不同的频道相当于无向图的着色问题。相对此题最多需要4中颜色。
当只有一个结点时,只需一种颜色。
否则依次用2和3去求解,如果可以成功,则为求解结果,否则最后结果为4
着色用深度优先搜索进行
#include
#include
#include
#include
#include
#include
using namespace std; int n; int g[30][30]; int used[30]; char s[30]; int dfs(int id, int color)//id:起始着色;color:限制着色 { int flag;//着色成功标志 int i,j; for (i = 1; i <= color; i++)//在规定颜色数中着色 { used[id] = i;//结点id使用第i号着色 flag = 1; for (j = 0; j < id; j++)//判断相邻结点是否采用该着色 { if (g[j][id] && used[j] ==used[id]) { flag = 0;//该颜色已使用,换着色 break; } } if (flag && (id == n - 1 || dfs(id + 1, color)))//该颜色有效,所有结点着色完毕返回true,或给下一结点着色 { return 1; } } return 0;//使用color个颜色着色没有实现全部着色 } int main() { while (scanf("%d", &n) && n) { bool one = true;//只要一种颜色标志,构造无向图 memset(g,0,sizeof(mp));//初始时,清零 int i,j; for (j = 0; j < n;j++) { scanf("%s", s); for (i = 2; i