• hackerrank 训练军队


    高阶传送魔法

    在神奇的Kasukabe国家,人们努力拥有一个技能。一共有N个类型的技能,并且开始的时候拥有第 i 种技能的人有Ci个 

    这个国家有T个巫师,他们有能力将一个人的技能进行转换。每个巫师有两个转移的列表,A和B , 他可以将一个人的技能从技能x转换为技能y当且仅当x∈A并且y∈B,转换后他会把x从A中删除,y从B中删除 

    注意:

    • 一个巫师可以进行 0 或 多次转换,只要他的转换满足上述要求。
    • 一个人可以进行多次转换。
    • 技能同类转换也是允许的。

    你的目标是设计一系列的转换是的最后所有人获得最多不同的技能。

    只要想到网络流就很容易了

    #include<cstdio>
    #include<algorithm>
    #define MN 40001
    using namespace std;
    
    int read_p,read_ca,read_f;
    inline int read(){
        read_p=0;read_ca=getchar();read_f=1;
        while(read_ca<'0'||read_ca>'9') read_f=read_ca=='-'?-1:read_f,read_ca=getchar();
        while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar();
        return read_p*read_f;
    }
    const int INF=1e9;
    struct na{int y,z,ne;}b[MN*100];
    int n,m,num=1,no=0,S,T,mmh=0,g[MN],c[MN],d[MN],l[MN];
    inline void in(int x,int y,int z){b[++num].y=y;b[num].z=z;b[num].ne=l[x];l[x]=num;}
    inline void add(int x,int y,int z,int Z=0){in(x,y,z);in(y,x,Z);}
    inline int min(int a,int b){return a<b?a:b;}
    int sap(int x,int f){
        if (x==T) return f;
        int h=0,q;
        for (int i=d[x];i;i=b[i].ne)
        if (b[i].z&&g[b[i].y]+1==g[x]){
            q=sap(b[i].y,min(b[i].z,f-h));
            h+=q;b[i].z-=q;b[i^1].z+=q;
            if (h==f||g[S]==no) return h;
        }
        if (!(--c[g[x]])) g[S]=no;d[x]=l[x];c[++g[x]]++;
        return h;
    }
    signed main(){
        static int a[1001],b[1001];
        register int i,j;
        n=read();m=read();S=0;T=no=n*m*3+n+1;
        if (!m){
            for (int i=1;i<=n;i++) mmh+=bool(read());
            printf("%d
    ",mmh);
            return 0; 
        }
        for (i=1;i<=n;i++) add(S,i,read()),add(n*m*3+i,T,1);
        for (int k=0;k<m;k++){
            int N=k*3*n;
            a[0]=read();
            for (i=1;i<=a[0];i++) a[i]=read();
            b[0]=read();
            for (i=1;i<=b[0];i++) b[i]=read();
            for (i=1;i<=n;i++) add(N+i,N+n+i,1),add(N+2*n+i,N+3*n+i,1),add(N+i,N+3*n+i,INF);
            for (i=1;i<=a[0];i++)
            for (j=1;j<=b[0];j++) add(N+n+a[i],N+2*n+b[j],1);
        }
        for (;g[S]<no;mmh+=sap(S,INF));
        printf("%d
    ",mmh);
    }
    View Code
  • 相关阅读:
    025-Cinder服务-->安装并配置一个本地存储节点(ISCSI)
    023-OpenStack 创建实例类型临时磁盘的讲解
    addClass+siblings+removeClass用意:
    SublimeText 改变 tab的距离
    正则表达式选取数值
    正则表达式用来根据某种匹配模式寻找字符串中的某些单词。
    hasOwnProperty()函数
    翻转字符串算法
    输入框禁用和启用
    什么是thinkphp
  • 原文地址:https://www.cnblogs.com/Enceladus/p/7099883.html
Copyright © 2020-2023  润新知