L2-023 图着色问题 (25 分)(图的遍历)

简介: L2-023 图着色问题 (25 分)(图的遍历)

描述:


图着色问题是一个著名的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
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const ll maxx = 1e18;
const int N = 1e6+100;
const int p = 1e4+10;
const double eps = 1e-8;
vector<int>ve[1001];
int n,m,k;
int a,b;
int co[N];
int q;
map<int,int>mp;
int judge()
{
  for(int i=1;i<=n;i++)
  {
    int len=ve[i].size();
    for(int j=0;j<len;j++)
    {
      if(co[i]==co[ve[i][j]])
      return 0;
    }//判断临边是否有颜色相同存在
  }
  return 1;
}
int main()
{ 
  cin>>n>>m>>k;
  for(int i=1;i<=m;i++)
  {
    cin>>a>>b;
    ve[a].push_back(b);
    ve[b].push_back(a);
  }//建立无向图
  cin>>q;
  for(int i=1;i<=q;i++)
  {
    mp.clear();
    for(int j=1;j<=n;j++)
    {
      cin>>co[j];
      mp[co[j]]++;
    }
    if(mp.size()!=k)//判断颜色数是否合法
    {
      cout<<"No"<<endl;
    }
    else
    {
      if(judge()==1)
      {
        cout<<"Yes"<<endl;
      }
      else
      {
        cout<<"No"<<endl;
      }
    }
  }
  return 0;
}

目录
相关文章
从这个类关系图中你可以看出什么?
从这个类关系图中你可以看出什么?
|
4月前
6366. 在网格图中访问一个格子的最少时间(dijkstra在矩阵上的运用)
6366. 在网格图中访问一个格子的最少时间(dijkstra在矩阵上的运用)
|
11月前
|
算法 测试技术 C++
C++算法:图中的最短环
C++算法:图中的最短环
|
算法
|
存储
L2-023 图着色问题 (25 分)
L2-023 图着色问题 (25 分)
111 0
L2-023 图着色问题 (25 分)
【CCCC】L2-023 图着色问题 (25分),图的染色判定,遍历
【CCCC】L2-023 图着色问题 (25分),图的染色判定,遍历
173 0
L2-023 图着色问题 (25 分)(图论)
L2-023 图着色问题 (25 分)(图论)
380 0
|
存储
【32. 图中的层次(图的广度优先遍历)】
思路 - 因为所有的`边长都为1`,所以可以使用`宽度优先搜索`的思想,每当队列pop出一个元素时,将其距离为1的节点都加到队列中(层次遍历思想) - `st[]`标记各个节点有没有走过,`d[]`保存1号节点到各个节点的距离,初始时都为-1。
140 0
【32. 图中的层次(图的广度优先遍历)】
|
存储 算法 搜索推荐
C++实现图 - 05 拓扑排序
今天来讲另一个非常重要的知识点 —— 拓扑排序。咋一看好像是一个排序算法,然而它和排序扯不上半点关系,它可以用于判断我们的图中是否存在有向环。
574 0
C++实现图 - 05 拓扑排序