• hdu3572 任务分配/最大流量推论全流


    意甲冠军:将n分配的任务m机。到的每个任务需要的天数(如果没有持续的日常),并能做到在哪些天任务。询问是否有计划。

    典型的任务(X)----日(Y)一半的最大流量,(因为这个任务是天之间的关系)处理器控制流。来源X外交部点,它指的是需要几天。任务xi,为了能够做到即使天,流1,个Y部点向汇点连流量为m,表示该天最多用M个机器。

    ps:注意输出格式

    #include<iostream>
    #include<queue>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int inf=0x3f3f3f3f;
    const int maxv=1001,maxe=200101;
    int nume=0;int head[maxv];int e[maxe][3];
    void inline adde(int i,int j,int c)
    {
        e[nume][0]=j;e[nume][1]=head[i];head[i]=nume;
        e[nume++][2]=c;
        e[nume][0]=i;e[nume][1]=head[j];head[j]=nume;
        e[nume++][2]=0;
    }
    int ss,tt,n,m,all;
    int vis[maxv];int lev[maxv];
    bool bfs()
    {
        for(int i=0;i<maxv;i++)
          vis[i]=lev[i]=0;
        queue<int>q;
        q.push(ss);
        vis[ss]=1;
        while(!q.empty())
        {
            int cur=q.front();
            q.pop();
            for(int i=head[cur];i!=-1;i=e[i][1])
            {
                int v=e[i][0];
                if(!vis[v]&&e[i][2]>0)
                {
                    lev[v]=lev[cur]+1;
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
        return vis[tt];
    }
    int dfs(int u,int minf)
    {
        if(u==tt||minf==0)return minf;
        int sumf=0,f;
        for(int i=head[u];i!=-1&&minf;i=e[i][1])
        {
            int v=e[i][0];
            if(lev[v]==lev[u]+1&&e[i][2]>0)
            {
                f=dfs(v,minf<e[i][2]?minf:e[i][2]);
                e[i][2]-=f;e[i^1][2]+=f;
                sumf+=f;minf-=f;
            }
        }
        if(!sumf) lev[u]=-1;
        return sumf;
    }
    int dinic()
    {
        int sum=0;
        while(bfs())sum+=dfs(ss,inf);
        return sum;
    }
    void read_build()
    {
        int pi,si,ei;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d",&pi,&si,&ei);
            all+=pi;
            adde(ss,i,pi);
            for(int j=si;j<=ei;j++)
            {
                adde(i,n+j,1);
            }
        }
        for(int i=1;i<=500;i++)
        {
            adde(i+n,tt,m);
        }
    }
    void init()
    {
        scanf("%d%d",&n,&m);
        nume=0;all=0;
        memset(head,-1,sizeof(head));
        ss=n+501;tt=n+502;
    }
    int main()
    {
        int T;
        scanf("%d",&T);int ct=1;
        while(T--)
        {
            init();
            read_build();
            int ans=dinic();
            if(ans==all)printf("Case %d: Yes
    
    ",ct++);
            else printf("Case %d: No
    
    ",ct++);
        }
    }
    



  • 相关阅读:
    派生
    什么是类的继承
    python中一切皆对象
    类之属性查找
    类之 __init__方法

    MySql cmd下的学习笔记 —— 有关分组的操作(group by)
    MySql cmd下的学习笔记 —— 有关select的操作(max, min等常见函数)
    MySql cmd下的学习笔记 —— 有关select的操作(in, and, where, like等等)
    MySql cmd下的学习笔记 —— 有关表的操作(对表的增删改查)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5041567.html
Copyright © 2020-2023  润新知