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


猜你喜欢

转载自www.cnblogs.com/houzm/p/12241041.html