其他分享
首页 > 其他分享> > PAT 1154 Vertex Coloring

PAT 1154 Vertex Coloring

作者:互联网

这一题是图上的每个点涂上颜色,如果相连的点的颜色都不同就是k-coloring,k是颜色的种类,如有相同则不是。
原来以为是用BFS,发现图上每一个点不一定都连在一起。直接对每个点的相连的点进行遍历,已经遍历过的点标记一下,判断是否相连的点的颜色有相同。
在写这一题的时候还去查了一下int n=10; int a[10];为什么这段代码可以运行,以前书上说是不可以运行。后来发现是c++新的标准。
我原来写set插入元素都先判断是否存在然后插入,现在看到别人是直接插入,发现这样也可以。看了一下《c++primer》发现是可以的,记录一下。

#include <bits/stdc++.h>
using namespace std;

void isSame(int length,int color[],vector<int> vec[])
{
    int vis[length] = {0};
    int index = 0;
    bool same = false;
   for(int j=0;j<length;j++){
     if(!vis[j]) {
            vis[j] = 1;
            for(int i=0; i<vec[j].size(); i++) {
                index = vec[j][i];
                if(!vis[index]) {
                    if(color[j] == color[index]) {
                        same = true;
                        break;
                    }
                }
            }
            if(same) {
                break;
            }
        }
   }

    if(same) {
        printf("No\n");
    } else {
    set<int> colorSets;
    for(int i=0; i<length; i++) {
            colorSets.insert(color[i]);
    }
        printf("%d-coloring\n",colorSets.size());
    }
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    vector<int> vec[n];
    int x,y;
    for(int i=0; i<m; i++) {
        scanf("%d%d",&x,&y);
        vec[x].push_back(y);
        vec[y].push_back(x);
    }
    int color[n]= {0};
    int k;
    scanf("%d",&k);
    for(int i=0; i<k; i++) {
        for(int j=0; j<n; j++) {
            scanf("%d",&color[j]);
        }
        isSame(n,color,vec);
    }


    return 0;
}

Genius_J 发布了82 篇原创文章 · 获赞 6 · 访问量 3万+ 私信 关注

标签:10,Coloring,PAT,int,1154,c++,length,vec,颜色
来源: https://blog.csdn.net/Genius_J/article/details/104107219