思路:DFS
柳神写的代码让我自惭形秽,我是个菜鸡
#include <iostream>
#include <vector>
#include <set>
using namespace std;
const int maxn = 10005;
vector<int> color(maxn);
vector<int> v[maxn];
bool visited[maxn] = {false};
//int h[maxn];
//int cnt = 0;
//int sumOfColor(int n){
// int cnt = 0;
// for(int i=0; i<n; i++){
// if(h[i] != -1) cnt++;
// }
// return cnt;
//}
void dfs(int u, bool &flag){
// 标记该点为已访问
visited[u] = true;
for(int i=0; i<v[u].size(); i++){
int tmp = v[u][i];
if(color[u] == color[tmp]){
flag = false;
return;
}
if(visited[tmp] == false){
dfs(tmp, flag);
}
}
// for(int i=0; i<v[u].size(); i++){
// int tmp = v[u][i];
// if(visited[tmp] == false){
// dfs(tmp, flag);
// }
// }
}
int main(){
int n;// 顶点数
int m;// 边数
int k;
scanf("%d %d", &n, &m);
color.resize(n);
int v1, v2;
for(int i=0; i<m; i++){
scanf("%d %d", &v1, &v2);
v[v1].push_back(v2);
}
scanf("%d", &k);
int tmp;
for(int i=0; i<k; i++){
bool flag = true;
set<int> h;
for(int j=0; j<n; j++){
//h[j] = -1;
visited[j] = false;// 保证每次DFS,节点是未访问状态
}
for(int j=0; j<n; j++){
scanf("%d", &tmp);
color[j] = tmp;
//h[tmp] = 1;
h.insert(tmp);// 自动去重
}
//cnt = sumOfColor(n);
//cnt = h.size();
for(int j=0; j<n; j++){
if(visited[j] == false){
dfs(j, flag);
}
if(flag == false) break;
}
//if(flag == true) printf("%d-coloring\n", cnt);
if(flag == true) printf("%d-coloring\n", h.size());
else printf("No\n");
}
return 0;
}
柳神代码:
#include <iostream>
#include <vector>
#include <set>
using namespace std;
struct node {int t1, t2;};
int main() {
int n, m, k;
cin >> n >> m;
vector<node> v(m);
for (int i = 0; i < m; i++)
scanf("%d %d", &v[i].t1, &v[i].t2);
cin >> k;
while (k--) {
int a[10009] = {0};
bool flag = true;
set<int> se;
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
se.insert(a[i]);
}
for (int i = 0; i < m; i++) {
if (a[v[i].t1] == a[v[i].t2]) {
flag = false;
break;
}
}
if (flag)
printf("%d-coloring\n", se.size());
else
printf("No\n");
}
return 0;
}
参考文献
- [1] https://blog.youkuaiyun.com/liuchuo/article/details/84973030