zoukankan      html  css  js  c++  java
  • L2-023. 图着色问题

    图着色问题是一个著名的NP完全问题。给定无向图 G = (V, E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?

    但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解。

    输入格式:

    输入在第一行给出3个整数V(0 < V <= 500)、E(>= 0)和K(0 < K <= V),分别是无向图的顶点数、边数、以及颜色数。顶点和颜色都从1到V编号。随后E行,每行给出一条边的两个端点的编号。在图的信息给出之后,给出了一个 正整数N(<= 20),是待检查的颜色分配方案的个数。随后N行,每行顺次给出V个顶点的颜色(第i个数字表示第i个顶点的颜色),数字间以空格分隔。题目保证给定的无 向图是合法的(即不存在自回路和重边)。

    输出格式:

    对每种颜色分配方案,如果是图着色问题的一个解则输出“Yes”,否则输出“No”,每句占一行。

    输入样例:
    6 8 3
    2 1
    1 3
    4 6
    2 5
    2 4
    5 4
    5 6
    3 6
    4
    1 2 3 3 1 2
    4 5 6 6 4 5
    1 2 3 4 5 6
    2 3 4 2 3 4
    
    输出样例:
    Yes
    Yes
    No
    No
    


    只要颜色数不等于k,就不符合,如果等于,再通过邻接矩阵判断就好。

    代码:


    #include <iostream>
    #include <map>
    using namespace std;
    int main()
    {
        int v,e,k,x,y;
        int mp[501][501]={0};
        int color[501];
        cin>>v>>e>>k;
        for(int i=0;i<e;i++)
        {
            cin>>x>>y;
            mp[x][y]=mp[y][x]=1;
        }
        int n;
        cin>>n;
        map<int,int> co;
        for(int i=0;i<n;i++)
        {
            co.clear();
            int flag=1,c=0;
            for(int j=1;j<=v;j++)
            {
                cin>>color[j];
                if(!co[color[j]])co[color[j]]++,c++;
            }
            if(c==k)
            for(int j=1;j<v;j++)
            {
                for(int l=j+1;l<=v;l++)
                if(color[j]==color[l]&&mp[j][l])
                {
                    flag=0;
                    break;
                }
                if(!flag)break;
            }
            else flag=0;
            if(flag)cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }
    }

     重新做了一遍,用dfs,访问过的点仍然要判断是否是邻边同色,而且,图不一定是连通的。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <vector>
    #include <set>
    using namespace std;
    int V,E,K,n,a,b;
    vector<int> v[501];
    int s[501];
    bool dfs(int k,bool *vis) {
        bool flag = true;
        for(int i = 0;i < v[k].size();i ++) {
            if(s[k] == s[v[k][i]]) return false;
            if(vis[v[k][i]]) continue;
            vis[v[k][i]] = true;
            flag &= dfs(v[k][i],vis);
        }
        return flag;
    }
    bool check() {
        bool vis[501] = {false};
        bool flag = true;
        for(int i = 1;i <= V;i ++) {
            if(vis[i]) continue;
            vis[i] = true;
            flag &= dfs(i,vis);
        }
        return flag;
    }
    int main() {
        cin>>V>>E>>K;
        for(int i = 0;i < E;i ++) {
            cin>>a>>b;
            v[a].push_back(b);
            v[b].push_back(a);
        }
        cin>>n;
        for(int i = 0;i < n;i ++) {
            set<int> num;
            for(int j = 1;j <= V;j ++) {
                cin>>s[j];
                num.insert(s[j]);
            }
            puts(num.size() == K && check() ? "Yes" : "No");
        }
    }
    
    
  • 相关阅读:
    Oracle Core 学习笔记二 Transactions 和 Consistency 说明
    Oracle AUTO_SPACE_ADVISOR_JOB 说明
    Windows 下 ftp 上传文件 脚本
    Oracle 11g 中 Direct path reads 特性 说明
    Linux 使用 wget 下载 Oracle 软件说明
    Oracle 10g read by other session 等待 说明
    Oracle 11g RAC INS06006 Passwordless SSH connectivity not set up between the following node(s) 解决方法
    SecureCRT 工具 上传下载数据 与 ASCII、Xmodem、Ymodem 、Zmodem 说明
    Oracle RAC root.sh 报错 Timed out waiting for the CRS stack to start 解决方法
    Oracle RESETLOGS 和 NORESETLOGS 区别说明
  • 原文地址:https://www.cnblogs.com/8023spz/p/7352753.html
Copyright © 2011-2022 走看看