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;
    }
    
  • 相关阅读:
    windwos8.1英文版安装SQL2008 R2中断停止的解决方案
    indwows8.1 英文版64位安装数据库时出现The ENU localization is not supported by this SQL Server media
    Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
    SQL数据附加问题
    eclipse,myeclipse中集合svn的方法
    JAVA SSH 框架介绍
    SSH框架-相关知识点
    SuperMapRealSpace Heading Tilt Roll的理解
    SuperMap iserver manage不能访问本地目的(IE9)
    Myeclipse中js文件中的乱码处理
  • 原文地址:https://www.cnblogs.com/houzm/p/12241041.html
Copyright © 2011-2022 走看看