1154 Vertex Coloring (25 分)

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

After 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

思路

在解这道题目时要看清楚节点的编号是0到N-1,如果忽视了这一条就可能出错。先使用vector数组将整个无向连通图存储起来,然后比较每一个已经读取到的节点,判断该节点的邻接节点时候和该节点的颜色相同。计算出现到底有几种颜色色就需要用到set容器,在获得节点的颜色序列的过程中将每一种颜色插入到该容器中,最有这个set集合的大小就是这个颜色总数。

#include <iostream>
#include<vector>
#include <map>
#include<set>
using namespace std;
vector<vector<int>> matrix;
vector<int> temp_mat;
set<int> count_set;
bool judge(int vertex) { // 通过使用vector存储的图结构来判断相邻节点时候颜色相同
	int length = matrix[vertex].size();
	for (int i = 0; i < length; i++) {
		if (temp_mat[matrix[vertex][i]] == temp_mat[vertex]) {
			return true;
		}
	}
	return false;
}
int main()
{
	int n, m;
	cin >> n >> m;
	matrix.resize(n + 1);
	for (int i = 0; i < m; i++) {
		int v1, v2;
		cin >> v1 >> v2;
		matrix[v1].push_back(v2);// 构造无向连接图
		matrix[v2].push_back(v1);
	}
	int k;
	cin >> k;
	temp_mat.resize(n + 1);//用于存储颜色序列
	for (int i = 0; i < k; i++) {
		for (int j = 0; j <n; j++) {
			cin >> temp_mat[j];
			count_set.insert(temp_mat[j]);//利用set计算所有出现的颜色总数
		}
		bool flag = false;
		for (int j = 0; j <n; j++) {
			flag = judge(j);
			if (flag == true) break;//如果点着色不可行,就马上终止判断
		}
		if (flag == true) cout << "No" << endl;
		else {
			cout << count_set.size() << "-coloring"<<endl;
		}
		count_set.clear();
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值