题目链接:图着色问题
本次训练赛这一题没有AC,主要原因:
1、没有注意到题目中颜色种类为K的条件,主观认为只要颜色种类小于等于K种就是一种合法解答
2、存边的数组开太小,无向图最多的边数为:,本次题目中有500个点,那么最多应该有124750条边,我一开始存边的数组只开了50005,不到一半,导致数组越界。
代码如下:(主要是本人在比赛时写的,没有重构代码)
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <vector>
#include <set>
#include <cstring>
#define fi(i,L,R) for(int i=(L);i<=(R);++i)
#define fd(i,R,L) for(int i=(R);i>=(L);--i)
#define coutL(a) cout<<(a)<<endl
using namespace std;
int edge[500005][2];
int color[500005];
int v,e,k;
set<int>s;
bool flag;
int main (void)
{// 未AC,离谱
cin>>v>>e>>k;
fi(i,1,e) {
cin>>edge[i][0]>>edge[i][1];
}
int n;
cin>>n;
while(n--) {
flag=false;
memset(color,0,sizeof(color));
s.clear();
int max_color=0;
fi(i,1,v) {
cin>>color[i];
s.insert(color[i]);
max_color = max(color[i],max_color);
}
if(max_color>v) {
puts("No");
continue;
}
if(s.size()!=k) { // 要检测该解是否是k种颜色。。。。题目也没说啊,离谱
puts("No");
continue;
}
fi(i,1,e) {
if(color[edge[i][0]] == color[edge[i][1]] && color[edge[i][0]]!=0)
{ // 被染色了才能比较,否则两个都是0,不过题目数据已经保证
puts("No");
flag=true;
break;
}
}
if(flag==false) {
puts("Yes");
}
}
return 0;
}