zoukankan      html  css  js  c++  java
  • 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
    ",cs.size());
    		else printf("No
    ");
    	}
    	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
    ",cs.size());
    		else printf("No
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    java中重载与重写的区别
    Java中数组的初始化方式
    break和continue的区别
    do while 循环和while循环的区别
    Java注释分类
    Java中的switch语句后面的控制表达式的数据类型
    DBA_TABLES之BLOCKS AND EMPTY_BLOCKS
    show_space 脚本
    Linux 6 配置multipath
    环保创业的可行之道——Leo鉴书上66
  • 原文地址:https://www.cnblogs.com/houzm/p/12241041.html
Copyright © 2011-2022 走看看