T1
- 题目虽然叫循环流,但是本题却和网络流没有什么关系,你只需要循环流的性质,流入量等于流出量就好。
- 好的,我们来看下一数据范围。
- 是不是突然觉得稳了?我们有a,b两种边,那么枚举每一条边,然后枚举两两点对,显然有一个复杂度为\((n*n)^{a+b}\)*n的算法,就是枚举所有情况,然后判断是否可行。这样可以有35分。
- 啊咧?这分也不高啊。莫慌,子任务3的数据虽然有点大吧,但是十几分钟总是可以跑出来的,打个表就好了。恩50分到手了。
- 打表还有一点用处,就是你方便找规律确定自己猜的结论的正确性。
- 考虑怎样用给定的边构造一个循环流,显然是流量为1的所有边形成一个环,流量为2的所有边形成一个环,环独自流量守恒,且互不影响,如果形成的环之间还是联通的,那么就构造出了可行解。不过这个是有特殊情况的,比如说一个流量为2的边可以结合若干个流量为1的边形成两个环。或者流量为2的边不够用,1来凑。
- 你画若干个图之后,会发现以下结论:
- 如果a=1,一定无解
- 如果a和b其中一个为0,只需要另一个大于等于n就存在解。否则无解
- 如果a+b<n,一定无解
- 如果a+b>n,并且a!=1,一定有解。
- 注意特判n=2的情况,以上所述性质,2不满足!
Coding
#include<bits/stdc++.h>
using namespace std;
int t,n,a,b;
int main(){
freopen("flow.in","r",stdin);
freopen("flow.out","w",stdout);
scanf("%d",&t);
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&a,&b);
if(n==2){
if(a%2==1) printf("0\n");
else if(a+b>=n&&a>0&&b%2==1&&a%2==0) printf("1\n");
else if(a+b>=n&&a%2==0&&b%2==0) printf("1\n");
else printf("0\n");
continue;
}
if(a+b<n) printf("0\n");
else if(a+b==n){
if(a==0||b==0) printf("1\n");
else printf("0\n");
}else if(a+b>n){
if(a==1) printf("0\n");
else printf("1\n");
}
}
return 0;
}
T2是一道神仙题,我只会15分的简单整除分块,所以就不写了。
T3感觉更不友好,暴力也不好想,就愉快的0分了。