pat 1154 Vertex Coloring (simple simulation of the FIG.)

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

Thinking

This problem is that each point has a different color, that Italy needs to find a special structure to meet the adjacent sides of the same color can not, if this is the case, then output this figure how many colors there are a structure, if the adjacent sides of
the same color, No output
this problem easily timeout adjacency matrix, so instead adjacency table
directly adjacent to the point are determined for each point once, if the presence of the same color dot outputs no

Code

#include<bits/stdc++.h>
using namespace std;
const int maxsize = 1e4 + 5;
//int edge[maxsize][maxsize];
vector<vector<int> > edge;
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    edge.resize(n + 1);
    int from, to;
    for(int i = 0; i < m; i++) {
        scanf("%d%d", &from, &to);
        edge[from].push_back(to);
        edge[to].push_back(from);
    }
    int k, color[n];
    scanf("%d", &k);
    set<int> s;
    while(k--) {
        s.clear();
        for(int i = 0; i < n; i++) {
            scanf("%d", &color[i]);
            s.insert(color[i]);
        }
        bool isColor = true;
        for(int i = 0; i < n && isColor; i++) {
            for(int j = 0; j < edge[i].size(); j++) {
                if(color[i] == color[edge[i][j]]) {
                    isColor = false;
                }
            }
        }
        if(isColor)
            printf("%d-coloring\n", s.size());
        else
            printf("No\n");
    }
    return 0;
}

Guess you like

Origin www.cnblogs.com/csyxdh/p/12483945.html