对于一个\(n\)个点的循环流网络,只存在容量为\(1\)或者\(2\)的边;
满足容量为\(1\)的边有\(a\)条,容量为\(2\)的边有\(b\)条;
询问是否存在这样的容量网络;
$1 \le T \le 127449 ?, ?2 \le n \le 50 ?, ?0 \le a,b \le 50 $ ;
#include<bits/stdc++.h>
using namespace std;
int C,T;
int main(){
freopen("flow.in","r",stdin);
freopen("flow.out","w",stdout);
scanf("%d%d",&C,&T);
while(T--){
int n,a,b;
scanf("%d%d%d",&n,&a,&b);
if(n==2){
if(!a&&!b){puts("0");continue;}//如果两个都没有则一定无法构成,否则其中一个一定有;
if(a&1){puts("0");continue;}//如果1边为奇数,那么一定不存在mid = (a+2b)/2,否则存在;
if(!a&&(b&1)){puts("0");continue;}//如果没有1边,那么2边的个数必须要是偶数才能达到mid;
puts("1");//否则一定可以先选2,再选1填到mid;
}else{
if(a==1){puts("0");continue;}//如果1边只有一个一定无法构成,否则1边的个数为0或者>=2;
if(a+b<n){puts("0");continue;}//如果两条边的和无法构成一个环显然无解;
if(a+b==n&&a&&b){puts("0");continue;}//当相等时一定是一个环,如果同时存在两种边则一定无解;
puts("1");//否则有a+b>n>=3,分以下情况去证明:
//首先明确2 和 3 可以构成所有>=2 的整数;
//1 : b == 1 , 可以将反向的1 + 2 - > 1 , 1边的个数 >= n >= 3, ;
//2 : b >= 2 , 此时很容易可以分别将a(已经讨论了a==1)和b分别成环,再组合起来,最小是a+b-1>=n的,可以覆盖;
}
}
return 0;
}
原文:https://www.cnblogs.com/Paul-Guderian/p/10635397.html