算法纠错2——图计算错误

题目链接:图着色问题

本次训练赛这一题没有AC,主要原因:

1、没有注意到题目中颜色种类为K的条件,主观认为只要颜色种类小于等于K种就是一种合法解答

2、存边的数组开太小,无向图最多的边数为:E_{max} = n(n-1)/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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

重理工小菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值