A safari park(野生动物园)has K species of animals, and is divided into N regions. The managers hope to spread the animals to all the regions, but not the same animals in the two neighboring regions. Of course, they also realize that this is an NP complete problem, you are not expected to solve it. Instead, they have designed several distribution plans. Your job is to write a program to help them tell if a plan is feasible.ios
Each input file contains one test case. For each case, the first line gives 3 integers: N (0<N≤500), the number of regions; R (≥0), the number of neighboring relations, and K (0<K≤N), the number of species of animals. The regions and the species are both indexed from 1 to N.算法
Then R lines follow, each gives the indices of a pair of neighboring regions, separated by a space.数组
Finally there is a positive M (≤20) followed by M lines of distribution plans. Each plan gives N indices of species in a line (the i-th index is the animal in the i-th rigion), separated by spaces. It is guaranteed that any pair of neighboring regions must be different, and there is no duplicated neighboring relations.ide
For each plan, print in a line Yes
if no animals in the two neighboring regions are the same, or No
otherwise. However, if the number of species given in a plan is not K, you must print Error: Too many species.
or Error: Too few species.
according to the case.this
6 8 3 2 1 1 3 4 6 2 5 2 4 5 4 5 6 3 6 5 1 2 3 3 1 2 1 2 3 4 5 6 4 5 6 6 4 5 2 3 4 2 3 4 2 2 2 2 2 2
Yes Error: Too many species. Yes No Error: Too few species.
一动物园有K种动物,被划分到N个区域(K<N),每个区域都有一种动物(可重复),先给出每一个区域相邻的关系和M个分配计划,每个分配计划给出,每个区域分配那个种类的动物,请问该计划分配的动物种类数目是否为K,若是多于K,输出Error: Too many species.
,若是小于K,输出Error: Too few species.
。若是等于K,那么判断是否存在两个相邻的区域有着相同种类的动物,若是没有,就输出Yes,不然输出No。spa
和以前的vertex coloring是一种类型的题目,其本质就是查询是否存在某一条边的两个顶点,其分配的动物种类编号相同(颜色相同)。那么咱们使用edges
数组存储全部的边,map speciesPerRegion
保存每个区域所分配的动物种类的映射,set species
集合存储每个计划所用到的动物种类数目,根据其大小与K的关系进行输出,在等于K的时候,遍历每一条边,判断两个顶点a和b是否出现speciesPerRegion[a]==speciesPerRegion[b]
,若是出现说明该计划不符合要求,输出No,不然输出Yes。对于species
大小大于K和小于K的时候就输出相应信息便可。code
#include<cstdio> #include<vector> #include<unordered_set> #include<unordered_map> #include<string> #include<iostream> using namespace std; struct Edge{ int a,b; }; int N,R,K;//顶点的个数,边数,动物种类数目 vector<Edge> edges; int main(){ scanf("%d %d %d",&N,&R,&K); Edge edge; for (int i = 0; i < R; ++i) { int a,b; scanf("%d %d",&edge.a,&edge.b); edges.push_back(edge); } int M; scanf("%d",&M); for (int j = 0; j < M; ++j) { unordered_set<int> species;//种类数目 unordered_map<int,int> speciesPerRegion;//每个region的物种数目 for (int i = 1; i <= N; ++i) { int num; scanf("%d",&num); species.insert(num); speciesPerRegion[i] = num; } if(species.size()>K){ printf("Error: Too many species.\n"); } else if(species.size()<K){ printf("Error: Too few species.\n"); } else { // 遍历每一条边 bool isTrue = true; for(auto &item:edges){ if(speciesPerRegion[item.a]==speciesPerRegion[item.b]){ isTrue = false; break; } } if(isTrue){ printf("Yes\n"); } else { printf("No\n"); } } } return 0; }