题解:P9954 [USACO20OPEN] Cowntact Tracing B

考虑暴力。

枚举让每头牛都当一次“零号病人”和 \(K\) 的所有组合,模拟感染的过程,检查得出的病人是否和给出的一样即可。

代码:

#include<bits/stdc++.h>
using namespace std;
bool infectedd[101];
int N,cowx[251],cowy[251];
bool check(int patient_zero,int K){
	bool infected[101]={false};
	int num[101]={0};
	infected[patient_zero]=true;
	for(int t=0;t<=250;t++){
		int x=cowx[t],y=cowy[t];
		if(x>0){
			if(infected[x]) num[x]++;
			if(infected[y]) num[y]++;
			if(num[x]<=K&&infected[x]) infected[y]=true;
			if(num[y]<=K&&infected[y]) infected[x]=true;
		}
	}
	for(int i=1;i<=N;i++)
		if(infected[i]!=infectedd[i]) return false;
	return true;
}

int main(){
	int T,t,x,y;
	string s;
	cin>>N>>T>>s;
	for(int i=1;i<=N;i++)
		infectedd[i]=s[i-1]=='1';
	for(int i=0;i<T;i++){
		cin>>t>>x>>y;
		cowx[t]=x;
		cowy[t]=y;
	}
	bool pi[101]={false};
	bool pk[252]={false};
	for(int i=1;i<=N;i++)
		for(int K=0;K<=251;K++)
			if(check(i,K))
				pi[i]=true,pk[K]=true;

	int lower_K=251,upper_K=0,pz=0;
	for(int K=0;K<=251;K++) if(pk[K]) upper_K=K;
	for(int K=251;K>=0;K--) if(pk[K]) lower_K=K;
	for(int i=1;i<=N;i++) if(pi[i]) pz++;
	cout<<pz<<" "<<lower_K<<" ";
	if(upper_K==251) cout<<"Infinity\n";
	else cout<<upper_K<<"\n";
	return 0;
}
posted @ 2024-10-02 17:42  cly312  阅读(61)  评论(0)    收藏  举报