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分了。

版权声明:本文为kgxw0430原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/kgxw0430/p/10444232.html