hdu3572(网络流)

来源:互联网 发布:mac语音播报怎么关闭 编辑:程序博客网 时间:2024/06/03 23:22

链接:点击打开链接

题意:有M个机器(代表一天可以同时干M天的工作),有N个任务。每个任务必须在Si或者以后开始做,在Ei或者之前完成,完成每个任务必须处理Pi个时间单位,问最后是否可以完成这N个任务

代码:

#include <set>#include <queue>#include <vector>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>using namespace std;const int INF=0x3f3f3f3f;struct node{    int u,v,cap;    node(){}    node(int u,int v,int cap):u(u),v(v),cap(cap){}}es[5000005];int R,S,T;int dis[5005],iter[5005];vector<int> tab[5005];void addedge(int u, int v, int cap){    tab[u].push_back(R);    es[R++]=node(u,v,cap);    tab[v].push_back(R);    es[R++]=node(v,u,0);}int bfs(){    int i,h;    queue<int> q;    q.push(S);    memset(dis,INF,sizeof(dis));    dis[S]=0;    while(q.size()){        h=q.front();        q.pop();        for(i=0;i<tab[h].size();i++){            node &e=es[tab[h][i]];            if(e.cap>0&&dis[e.v]==INF){                dis[e.v]=dis[h]+1;                q.push(e.v);            }        }    }    return dis[T]<INF;}int dfs(int x,int maxflow){    int flow;    if(x==T)    return maxflow;    for(int &i=iter[x];i<tab[x].size();i++){        node &e=es[tab[x][i]];        if(dis[e.v]==dis[x]+1&&e.cap>0){            flow=dfs(e.v,min(maxflow,e.cap));            if(flow){                e.cap-=flow;                es[tab[x][i]^1].cap+=flow;                return flow;            }        }    }    return 0;}int dinic(){    int ans,flow;    ans=0;    while(bfs()){        memset(iter,0,sizeof(iter));        while(flow=dfs(S,INF))        ans+=flow;    }    return ans;}int main(){                                     //把每个事件看做一个点,由源点    int n,m,t,i,j,u,v,w,cas,sum;                //向每个点连容量是这个事件花费    scanf("%d",&t);                             //的天数,将这个事件与和他能够    for(cas=1;cas<=t;cas++){                    //用的天数连容量是1的边,代表        scanf("%d%d",&n,&m);                    //每天最多做一工作量,在由每个        R=S=sum=0,T=1005;                       //时间点向汇点连容量是m的边,表        for(i=0;i<=T;i++)                       //示每天最多的工作量        tab[i].clear();        for(i=1;i<=n;i++){            scanf("%d%d%d",&w,&u,&v);            addedge(0,i,w);            for(j=u+n;j<=v+n;j++)            addedge(i,j,1);            sum+=w;        }        for(i=1;i<=500;i++)        addedge(i+n,T,m);        if(sum==dinic())        printf("Case %d: Yes\n\n",cas);        else        printf("Case %d: No\n\n",cas);    }    return 0;}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 usbkey密码忘了怎么办 农信房贷逾期几个小时怎么办 广东农信房贷逾期一天怎么办 三亚的房太潮了怎么办 没高中档案积分怎么办 临牌过期了怎么办 居住证凭证丢了怎么办 上海市居住证过期了怎么办 上海居住证积分不够怎么办 居住证登录密码忘记怎么办 投靠中考上海居住证怎么办 嫁入广州户口怎么办 上海积分扣完了怎么办 公立小学积分不够怎么办 查不到户口信息怎么办 小孩上不到户口怎么办 离开上海上海户口怎么办? 上海没房户口怎么办 没有房照动迁怎么办 持有上海居住证怎么办准生证 换公司后公积金怎么办 换工作了住房公积金怎么办 以前买的户口怎么办 上海落户积分不够怎么办 带坏受孕了怎么办 对公转账转错了怎么办 对公转错账怎么办 银行卡转错了怎么办 人户分离证明怎么办 暂居证怎么办才快 房产证户口本信息泄漏怎么办 户主迁走了户口怎么办 户口本丢了应该怎么办 户口本遗失了应该怎么办 户口迁出河南怎么办居住证 居住证学历写错怎么办 换单位了档案怎么办 辞职一年了档案怎么办 上海租房网签怎么办 户口本主页掉了怎么办 居转户办理中离职怎么办