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;
}

目录
相关文章
|
1月前
论多段图的最短路径问题(我认为本质上还是暴力枚举法)
本文讨论了多段图最短路径问题的解决方法,认为本质上是使用暴力枚举法,通过逐步计算每个阶段点的最短距离来确定从起点到终点的最短路径。
40 1
论多段图的最短路径问题(我认为本质上还是暴力枚举法)
|
6月前
6366. 在网格图中访问一个格子的最少时间(dijkstra在矩阵上的运用)
6366. 在网格图中访问一个格子的最少时间(dijkstra在矩阵上的运用)
|
6月前
|
存储 算法
图的深度优先算法
图的深度优先算法
40 0
|
算法 测试技术 C++
C++算法:图中的最短环
C++算法:图中的最短环
|
存储 索引
树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次
树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次
78 0
|
算法
|
存储
L2-023 图着色问题 (25 分)
L2-023 图着色问题 (25 分)
118 0
L2-023 图着色问题 (25 分)
【动态规划】多段图最短路径(动图演示)
多段图是一个有向的无环图。求解从起始点v0到终止点的最短路径的长度, 首先看一下这个问题是否具有最优子结构的性质。对于每一点来说,从v0 到它的最短路径有两种可能,分别是从v0直接到该点或者是从最短的前驱 节点开始到该节点。从这里可以看出有递归的性质,所以使用回溯的方法 也是可以解决的。即从终点开始,依次向前找到最短的路径。由于递归本 身所用的时间较长,并且在回溯的过程中存在重复的工作,所以使用动态规划更好。
【动态规划】多段图最短路径(动图演示)
【CCCC】L2-023 图着色问题 (25分),图的染色判定,遍历
【CCCC】L2-023 图着色问题 (25分),图的染色判定,遍历
180 0