考虑暴力。
枚举让每头牛都当一次“零号病人”和 \(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;
}
标签:false,P9954,题解,int,num,infected,Tracing,bool,101
From: https://www.cnblogs.com/cly312/p/18444915