PAT Advanced 1154 Vertex Coloring (25) [set,hash]

题目

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

原文地址:https://www.cnblogs.com/houzm/p/12241041.html

时间: 2024-10-09 18:11:34

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

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

PAT 甲级 1154 Vertex Coloring

https://pintia.cn/problem-sets/994805342720868352/problems/1071785301894295552 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 

PAT Advanced 1020 Tree Traversals (25分)

1020 Tree Traversals (25分) Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.

PAT (Advanced Level) 1078. Hashing (25)

二次探测法.表示第一次听说这东西... #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include<string> #include<algorithm> using namespace std; const int

PAT (Advanced Level) 1003. Emergency (25)

最短路+dfs 先找出可能在最短路上的边,这些边会构成一个DAG,然后在这个DAG上dfs一次就可以得到两个答案了. 也可以对DAG进行拓扑排序,然后DP求解. #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #include<queue> #include<vector> using nam

PAT (Advanced Level) 1029. Median (25)

scanf读入居然会超时...用了一下输入挂才AC... #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<queue> #include<iostream> #include<algorithm> using namespace std; const int maxn=1000000+10; int a[maxn],b

PAT (Advanced Level) 1070. Mooncake (25)

简单贪心.先买性价比高的. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include<string> #include<algorithm> using namespace std; double eps=1e-7

PAT (Advanced Level) 1032. Sharing (25)

简单题,不过数据中好像存在有环的链表...... #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #include<map> #include<queue> #include<vector> using namespace std; const int maxn=100000+10

PAT Advanced 1028 List Sorting (25分)

Excel can sort records according to any column. Now you are supposed to imitate this function. Input Specification: Each input file contains one test case. For each case, the first line contains two integers N (≤) and C, where N is the number of reco