PAT甲级 1154 顶点着色

原题链接

一个合适的顶点着色是指用各种颜色标记图中各个顶点,使得每条边的两个端点的颜色都不相同。

如果一种合适的顶点着色方案使用了一共 k 种不同的颜色,则称其为合适的 k 着色(k-coloring)。

现在,你需要判断给定的着色方案是否是合适的 k 着色方案。

输入格式
第一行包含两个整数 N 和 M,分别表示点和边的数量。

接下来 M 行,每行包含两个整数 a,b,表示点 a 和点 b 之间存在一条边。

所有点的编号从 0 到 N−1。

再一行包含一个整数 K,表示你需要判断的着色方案。

接下来 K 行,每行包含 N 个颜色,其中第 i 个颜色表示第 i 个点的颜色。

颜色用非负整数表示,不超过 int 范围。

输出格式
对于每种着色方案,如果是一种合适的 k 着色方案,则输出一行 k-coloring。

扫描二维码关注公众号,回复: 15958414 查看本文章

如果不是合适的着色方案,则输出一行 No。

数据范围
1≤N,M≤104,
1≤K≤100
输入样例:
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
输出样例:
4-coloring
No
6-coloring
No

我的解法:

#include <bits/stdc++.h>
using namespace std;
const int N = 10010;
int n, m, k;
struct {
    int a, b;
}Edge[N];
int color[N];
int main(){
    cin >> n >> m;
    for(int i = 0; i < m; i ++ ){
        cin >> Edge[i].a >> Edge[i].b;
    }
    cin >> k;
    while(k --){
        bool success = true;
        for(int i = 0; i < n; i ++ ) cin >> color[i];
        for(int i = 0; i < m; i ++ ){
            if(color[Edge[i].a] == color[Edge[i].b]) success = false;
        }
        if(success){
            unordered_set <int> S;
            for(int i = 0; i < n; i ++ ) S.insert(color[i]);
            printf("%d-coloring\n", S.size());
        }
        else puts("No");
    }
    return 0;
}

收获:

在数组中,用unordered_set<int>统计共有几种数字出现

插入方式 S.insert()

遍历方式 for(auto c : S)

与set区别:

set自动排序,unordered_set不自动排序

猜你喜欢

转载自blog.csdn.net/weixin_45660485/article/details/126046440