zoukankan      html  css  js  c++  java
  • 图m的着色问题(搜索)

    图的m着色问题
    【问题描述】
           给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的。图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法。
    【编程任务】
           对于给定的无向连通图G和m种不同的颜色,编程计算图的所有不同的着色法。
    【输入格式】
           文件color.in输入数据。第1行有3个正整数n,k 和m,表示给定的图G有n个顶点和k条边,m种颜色。顶点编号为1,2,…,n。接下来的k行中,每行有2个正整数u,v,表示图G 的一条边(u,v)。
    【输出格式】
           程序运行结束时,将计算出的不同的着色方案数输出到文件color.out中。
    【输入样例】
    5 8 4
    1 2
    1 3
    1 4
    2 3
    2 4
    2 5
    3 4
    4 5
    【输出样例】
    48
    在搜索的思维混乱了,加入search(1)是从第一个开始涂得意思,里面的的情况只是循环1-m种颜色,而我错误理解为开始涂得第一个有1-n个节点可以选择,
    每个节点还有1-m个颜色可以选,然后我就炸了....然后上网上搜了一下。。orz
    好了 说一下思路 每涂一个节点面临的情况都是涂一个和它前面后面都不样的颜色,所以要判断一下。
    【代码】
    #include<iostream>
    #include<cstdlib>
    #include<cstdio>
    using namespace std;
    int n,k,m,sum;
    int search(int);
    bool paint[50];
    int pic[50][50],node[50];
    bool pd(int,int);
    int main()
    {
    int x,y;
    scanf("%d%d%d",&n,&k,&m);
    for(int i=1;i<=k;i++)
    {
    
    scanf("%d%d",&x,&y);
    pic[x][y]=pic[y][x]=1;//相连 
    }
    search(1);
    printf("%d",sum);
    return 0;
    }
    int search(int x)//他的情况不是能涂哪个节点,因为我们就是从第一个开始涂色的,而是有m个颜色可涂; 
    {
    if(x>n)sum++;
    else
    for(int i=1;i<=m;i++)//每一个有1-m种情况可以涂
    {
    if(pd(x,i))//第x个涂第i种颜色 
    {
    node[x]=i;//第x个涂第i个颜色,这里记录的原因是为判断一个点和他相邻的点是否一个颜色 
    search(x+1);
    node[x]=0;//回溯 
    }
    }
    }
    bool pd(int x,int j)//判断
    {
    for(int i=1;i<=n;i++)
    {
    if(pic[x][i]&&node[i]==j)//如果与它相连并且与它将要涂的颜色一样 
    return 0;//返回假 
    }
    return 1;//否则真 
    }
  • 相关阅读:
    view 的继承关系
    dos 下小tip
    Required diagnostic data collection for RMAN backup
    数据库应用设计设计报告
    程序 从存储卡 内存卡 迁移到 SD卡
    c++ 参赛设置
    c++ 用构造函数
    Ip
    error C3872: “0x3000”: 此字符不允许在标识符中使用
    机器字长 32位与64位的区别
  • 原文地址:https://www.cnblogs.com/zzyh/p/6623379.html
Copyright © 2011-2022 走看看