图的m着色问题ACC PASCAL

本文介绍了一种解决图的m着色问题的方法,即利用递归回溯算法寻找所有可能的不同着色方案,确保图中任意相邻节点颜色不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 图的m着色问题

    Time Limit:10000MS  Memory Limit:65536K Total Submit:53 Accepted:46 Case Time Limit:1000MS

    Description

    图的m 着色问题描述如下:给定无向连通图G 和m 种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。如果有一种着色法使G 中每条边的2 个顶点着不同颜色,则称这个图是m 可着色的。图的m着色问题是对于给定图G和m 种颜色,找出所有不同的着色法。 编程任务: 对于给定的无向连通图G 和m种不同的颜色,编程计算图的所有不同的着色法。

    Input

    输入由多组测试数据组成。 每组测试数据输入的第一行有3 个正整数n,k 和m,表示给定的图G 有n个顶点和k条边,m种颜色。顶点编号为1,2,…,n。接下来的k行中,每行有2个正整数u,v,表示图G 的一条边(u,v)。

    Output

    对应每组输入,输出的每行是计算出的不同的着色方案数。

    Sample Input

    5 8 4
    1 2
    1 3
    1 4
    2 3
    2 4
    2 5
    3 4
    4 5
    

    Sample Output

    48

    Source


  • 这道题就是要开2个数组,其中一个是二维数组,用来判断是否相连,一个一维数组记录是什么颜色!!!
  • 
    
  • var
      i,j,k,n,m,s:longint;
      v,b:array[1..1000]of longint;
      c:array[1..1000,1..1000]of boolean;
    procedure init;
    var
      x,y:longint;
    begin
      readln(n,m,k);
      for i:=1 to m do
        begin
          read(x,y);
          c[x,y]:=true;
          c[y,x]:=true;
        end;
    end;
    
    function aaa(n,max:longint):boolean;
    var
      i:longint;
    begin
      aaa:=true;
      for i:=1 to max-1 do
        if (c[max
        ,i]=true) and (v[i]=n)
        then exit(false);
    end;
    
    procedure aa(dep:longint);
    var
      i:longint;
    begin
    
      if dep>n then
        begin
          inc(s);
          exit;
        end;
      for i:=1 to k do
        begin
          if aaa(i,dep) then
            begin
              v[dep]:=i;
              aa(dep+1);
            end;
        end;
    end;
    
    begin
      s:=0;
      init;
      aa(1);
      write(s);
    end.
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值