zoukankan      html  css  js  c++  java
  • HDU3572 Task Schedule (网络流)

    某工厂有 M 台机器要完成 N 个任务。 第i个任务的开始时间不早于Si, 需要干Pi天, a并要在不晚于Ei时完成. 一台机器一天只能干一个任务,一个认为在同一天只能用一台机器. 任务完成不需要连续,只要有足够的天数即可。
    能不能搞完这些工作

    简单的最大流

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=2e5+100;
    const int inf=1e9;
    int n,m;
    struct node {
        int u,v,w,nxt;
    }edge[maxn<<1];
    int head[maxn],tot;
    void addedge (int u,int v,int w) {
        edge[tot].u=u;
        edge[tot].v=v;
        edge[tot].w=w;
        edge[tot].nxt=head[u];
        head[u]=tot++;
        
        edge[tot].u=v;
        edge[tot].v=u;
        edge[tot].w=0;
        edge[tot].nxt=head[v];
        head[v]=tot++;
    }
    
    int dep[maxn],inq[maxn],cur[maxn],wjm,maxflow,s,t;
    bool bfs () {
        for (int i=0;i<=t;i++) {
            cur[i]=head[i];
            dep[i]=inf;
            inq[i]=0;
        }
        dep[s]=0;
        queue<int> q;
        q.push(s);
        while (q.size()) {
            int u=q.front();
            q.pop();
            inq[u]=0;
            for (int i=head[u];i!=-1;i=edge[i].nxt) {
                int v=edge[i].v;
                if (dep[v]>dep[u]+1&&edge[i].w) {
                    dep[v]=dep[u]+1;
                    if (inq[v]==0) {
                        q.push(v);
                        inq[v]=1;
                    }
                }
            }
        }
        if (dep[t]!=inf) return 1;
        return 0;
    }
    int dfs (int u,int flow) {
        int increase=0;
        if (u==t) {
            wjm=1;
            maxflow+=flow;
            return flow;
        }
        int used=0;
        for (int i=cur[u];i!=-1;i=edge[i].nxt) {
            cur[u]=i;
            int v=edge[i].v;
            if (edge[i].w&&dep[v]==dep[u]+1) {
                if (increase=dfs(v,min(flow-used,edge[i].w))) {
                    used+=increase;
                    edge[i].w-=increase;
                    edge[i^1].w+=increase;
                    if (used==flow) break; 
                }
            }
        }
        return used;
    }
    int Dinic () {
        while (bfs()) {
            wjm=1;
            while (wjm==1) {
                wjm=0;
                dfs(s,inf);
            }
        }
        return maxflow;
    }
    
    int P[maxn],S[maxn],E[maxn];
    int main () {
        int _;
        scanf("%d",&_);
        for (int ca=1;ca<=_;ca++) {
            scanf("%d%d",&n,&m);
            for (int i=1;i<=n;i++) scanf("%d%d%d",P+i,S+i,E+i);
            //源点为0
            //m台机器为1~m
            //一共500天,天为m+1~m+500
            //一共n个任务,任务为m+500+1~m+500+n
            //源点向每个机器连一条容量为无限大的边
            //每个机器向每天连一条容量为1的边
            //每天向可以做的任务连一条容量为1的边
            //每个任务向汇点连一条容量为Pi的边
            //最后判断一下最大流是不是等于每个任务的Pi之和即可
            s=0;
            t=m+n+501;
            for (int i=0;i<=t;i++) head[i]=-1;tot=0;maxflow=0;wjm=0;
            for (int i=1;i<=m;i++) addedge(s,i,inf);
            for (int i=m+1;i<=m+500;i++) for (int j=1;j<=m;j++) addedge(j,i,1);
            for (int i=1;i<=n;i++) for (int j=S[i];j<=E[i];j++) addedge(j,i+m+500,1);
            int sum=0;
            for (int i=1;i<=n;i++) addedge(i+m+500,t,P[i]),sum+=P[i];
            if (Dinic()==sum)
                printf("Case %d: Yes
    
    ",ca);
            else
                printf("Case %d: No
    
    ",ca);
        }
    }
  • 相关阅读:
    代理匹配浅谈spring——自动创建代理(八)
    进程算法操作系统常见算法
    DTCoreText备忘
    内核用户态用户态和内核态的区别
    注释光标vim中如何快速去除注释# 或者 //字符
    方法执行[置顶] onPause()和onStop()的使用方法及注意事项
    录音函数网络对讲机C#服务器 Android客户端(二) C#服务器代码分析 附加
    匹配行linux中grep命令的使用
    最大整数NYOJ 44 字串和 370 巧克力 (最大连续字串和问题)
    行列方阵顺时针旋转
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/14026198.html
Copyright © 2011-2022 走看看