题目

A proper vertex coloring is a labeling of the graph’s vertices with colors such that no two vertices sharing the same edge have the same color. A coloring using at most k colors is called a (proper) k-coloring. Now you are supposed to tell if a given coloring is a proper k-coloring.

Input Specification:

Each input file contains one test case. For each case, the first line gives two positive integers N and M (both no more than 10^4), being the total numbers of vertices and edges, respectively. Then M lines follow, each describes an edge by giving the indices (from 0 to N−1) of the two ends of the edge. Afer the graph, a positive integer K (≤ 100) is given, which is the number of colorings you are supposed to check. Then K lines follow, each contains N colors which are represented by non-negative integers in the range of int. The i-th color is the color of the i-th vertex.

Output Specification:

For each coloring, print in a line k-coloring if it is a proper k-coloring for some positive k, or No if not.

Sample Input:

10 11

8 7

6 8

4 5

8 4

8 1

1 2

1 4

9 8

9 1

1 0

2 4

4

0 1 0 1 4 1 0 1 3 0

0 1 0 1 4 1 0 1 0 0

8 1 0 1 4 1 0 5 3 0

1 2 3 4 5 6 7 8 8 9

Sample Output:

4-coloring

No

6-coloring

No

题目分析

已知图每条边的顶点信息,查询已知条件为图每个顶点的颜色。要求在查询已知条件下图每条边两个顶点颜色不同,满足条件条件输出K-coloring(K为颜色数),否则输出No

解题思路

  1. 定义结构体edge,记录每条边两个顶点的数字
  2. 定义edge es[M],记录所有边的顶点信息
  3. 定义int acs[N],记录每个查询条件中每个顶点的颜色;set cs,记录每个查询条件颜色数
  4. 遍历所有边,验证查询条件每个顶点的颜色是否满足每条边两个顶点颜色不同

知识点

  1. 局部定义bool flag;

    局部循环中定义bool flag,某次循环将flag=true后,下一次循环执行到bool flag,并不会将flag重新初始化为false,而是使用上一次循环执行的结果
  2. set
set<int> s1; //初始化
s1.insert(10); //插入
//set<int>::iterator pos = s1.find(30); if (pos != s1.end()){//可找到} //查找
//int num = s1.count(30); //统计

Code

Code 01

#include <iostream>
#include <set>
using namespace std;
struct edge {
int left,right;
};
int main(int argc,char * argv[]) {
int N,M,K,T;
scanf("%d %d",&N,&M);
edge es[M];
for(int i=0; i<M; i++) {
scanf("%d %d",&es[i].left,&es[i].right);
}
scanf("%d",&K);
for(int i=0; i<K; i++) {
int acs[N] = {0};
set<int> cs;
for(int j=0;j<N;j++){
scanf("%d",&acs[j]);
cs.insert(acs[j]);
}
int j;
for(j=0;j<M;j++){
if(acs[es[j].left]==acs[es[j].right])break;
}
if(j==M)printf("%d-coloring\n",cs.size());
else printf("No\n");
}
return 0;
}

Code 02

#include <iostream>
#include <set>
using namespace std;
struct edge {
int left,right;
};
int main(int argc,char * argv[]) {
int N,M,K,T;
scanf("%d %d",&N,&M);
edge es[M];
for(int i=0; i<M; i++) {
scanf("%d %d",&es[i].left,&es[i].right);
}
scanf("%d",&K);
for(int i=0; i<K; i++) {
int acs[N] = {0};
set<int> cs;
for(int j=0;j<N;j++){
scanf("%d",&acs[j]);
cs.insert(acs[j]);
}
bool flag=false;// 如果不写=false;初始化是false,但是之后的循环,并不会重置为false,而依旧使用的是上一次循环处理结束的值
for(int j=0;j<M;j++){
if(acs[es[j].left]==acs[es[j].right]){
flag = true;
break;
}
}
if(!flag)printf("%d-coloring\n",cs.size());
else printf("No\n");
}
return 0;
}

PAT Advanced 1154 Vertex Coloring (25) [set,hash]的更多相关文章

  1. PAT Advanced 1154 Vertex Coloring (25 分)

    A proper vertex coloring is a labeling of the graph's vertices with colors such that no two vertices ...

  2. pat甲级 1154 Vertex Coloring (25 分)

    A proper vertex coloring is a labeling of the graph's vertices with colors such that no two vertices ...

  3. PAT 甲级 1154 Vertex Coloring

    https://pintia.cn/problem-sets/994805342720868352/problems/1071785301894295552 A proper vertex color ...

  4. PAT Advanced 1134 Vertex Cover (25) [hash散列]

    题目 A vertex cover of a graph is a set of vertices such that each edge of the graph is incident to at ...

  5. PTA 1154 Vertex Coloring

    题目链接:1154 Vertex Coloring A proper vertex coloring is a labeling of the graph's vertices with colors ...

  6. PAT Advanced 1048 Find Coins (25) [Hash散列]

    题目 Eva loves to collect coins from all over the universe, including some other planets like Mars. On ...

  7. PAT Advanced 1020 Tree Traversals (25 分)

    1020 Tree Traversals (25 分)   Suppose that all the keys in a binary tree are distinct positive integ ...

  8. PAT (Advanced Level) 1078. Hashing (25)

    二次探测法.表示第一次听说这东西... #include<cstdio> #include<cstring> #include<cmath> #include< ...

  9. PAT (Advanced Level) 1070. Mooncake (25)

    简单贪心.先买性价比高的. #include<cstdio> #include<cstring> #include<cmath> #include<vecto ...

随机推荐

  1. 074-PHP数组元素相乘

    <?php $arr1=array(3,4,5,6,'7',TRUE); //等价于 3*4*5*6*7*1=2520 $arr2=array(3,4,5,6,'7','hello'); //等 ...

  2. Elasticsearch 使用集群 - 删除索引

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

  3. 第十五篇 用户认证auth

    用户认证auth 阅读目录(Content) 用户认证 auth模块 1 .authenticate() 2 .login(HttpRequest, user) 3 .logout(request) ...

  4. vue学习(八)nextTick[异步更新队列]的使用和应用

    nextTick的使用 为了数据变化之后等待vue完成更新DOM,可以在数据变化之后立即使用Vue.nextTick()在当前的回调函数中能获取最新的DOM <div id="app& ...

  5. springboot+thymeleaf项目中使用th:replace访问templates子目录下的模板,会报错找不到模板路径

    解决方法: 先将模板路径放置templates目录下,发现可以访问,说明th:replace是可以用的. 那可能是出现在路径问题上面. 于是我开始调错,改路径. 后来在网上查找资料.说了很多种方法. ...

  6. 正则表达式入门(ed模糊匹配)

    元字符: /b 代表着单词的开头或结尾,也就是单词的分界处.如果要精确地查找hi这个单词的话,我们应该使用/bhi/b. .是另一个元字符,匹配除了换行符以外的任意字符,*同样是元字符,它指定*前边的 ...

  7. Egret Engine 2D - Get Started

    Get Started     Egret 也支持在命令行完成编译,运行,发布等操作.在下面的教程中会穿插对应操作的命令行代码.   可新建游戏项目,也可建eui项目   这里包含默认的几个库,egr ...

  8. Eclipse反编译插件jad的安装

    Eclipse反编译插件jad的安装 JadClipse是Jad的Eclipse插件,是一款非常实用而且方便的Java反编译插件.时间久了,可能忘记在哪里进行配置了,因此记录下以备后续使用(若需要). ...

  9. python虚拟环境配置(下)

    前言 嘿,各位小伙伴们,晚上好呀,新年快乐,注意预防流感哈,就不要出去浪了,万一中奖了,嗯...,还是当个宅男,宅男无敌,哈哈哈, 过年了,村都被封了,哎,出都出不去,想着干点啥,就把以前没完善的继续 ...

  10. B站 React教程笔记day1(4)调色板案例

    视频地址 main.js import React from "react" import { render } from "react-dom" import ...