1154 Vertex Coloring (25分)

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

#include<iostream>
#include<queue>
#include<cstring>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
int n, m;
vector<int> vec(n);
vector<bool> visit;
vector<int> vec_graph[10009];
//int graph[10001][10001] = {0};
set<int> set_k;
bool BFS(int start){
    queue<int> q;
    visit[start] = true;
    q.push(start);

   

    while (!q.empty())
    {
        start = q.front();
        q.pop();
        for(int z = 0; z < vec_graph[start].size(); z++){
            if(vec[start] == vec[vec_graph[start][z]])
                 
                 return false;
            if(!visit[vec_graph[start][z]]){

                visit[vec_graph[start][z]] = true;
                q.push(vec_graph[start][z]);
                
 
            }


        }
        
    }
    
   

    return true;

}

int main(){



    cin >> n >> m;
//    memset(graph, 0, sizeof(graph));
    for(int i = 0; i < m; i++){

        int temp_x , temp_y;
        scanf("%d %d", &temp_x, &temp_y);
//        cin >> temp_x >> temp_y;
        vec_graph[temp_x].push_back(temp_y);
//        vec_graph[temp_y].push_back(temp_x);
//        graph[temp_x][temp_y] = graph[temp_y][temp_x] = 1;

    }
    
    int k;
    scanf("%d", &k);

    for(int i = 0; i < k; i++){
//        bool visit[10001] = {false};
        visit.clear();
        vec.clear();
        set_k.clear();
        bool flag = true;
        for(int j = 0; j < n; j++){
            int temp;
            
            scanf("%d", &temp);

            vec.push_back(temp);
            set_k.insert(temp);
            visit.push_back(false);

        }
        for(int start = 0; start < n; start++){

            if(!visit[start])
                if(!BFS(start)){
                    
                    flag = false;
                    break;
                }


        }


        if(flag){
            cout << set_k.size() << "-coloring" << endl;
//            printf("%lu-coloring\n", set_k.size());

        }else
        {
            printf("No\n");
        }
        


    }



    return 0;
}
发布了32 篇原创文章 · 获赞 0 · 访问量 441

猜你喜欢

转载自blog.csdn.net/zbchenchanghao/article/details/104043345