ZOJ1084(四色定理)

题目链接: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 
          
         
       
      
      
     
     
    
    
   
   
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值