好久没有更新我的代码了
前段时间看了看A1154——Vertex Coloring,但是当时没看懂,(主要是数据结构还没学到图),今天心血来潮准备一探究竟。
其实题目并不难,就是判断一个无向图的边(edge)的顶点(vertex)是否重色。
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 //10个点对应的颜色
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
这道题唯一需要注意的是:点的标志(index)是从0开始的。
直接上代码:
#include<iostream>
#include<stdio.h>
#include<vector>
#include<set>
#include<map> //map中包含pair的头文件utility
using namespace std;
int main(){
int n,m,k;
cin >> n >> m;
vector< pair<int,int> > edge(m);
for(int i = 0;i < m;i++)
cin >> edge[i].first >> edge[i].second;
cin >> k;
while(k--){
set<int> temp;
bool judge = true;
vector<int> a(n);
for(int i = 0;i < n;i++){
cin >> a[i];
temp.insert(a[i]);
}
for(int i = 0;i < m;i++){
if(a[edge[i].first] == a[edge[i].second]){
judge = false;
break;
}
}
if(judge)
printf("%d-coloring\n",temp.size());
else
printf("No\n");
}
return 0;
}