hdu2883 kebab(判满流)

来源:互联网 发布:钢铁力量六级车数据 编辑:程序博客网 时间:2024/05/22 03:23

由于时间大,所以要离散化

建图:

源点0

源点到任务点

add(sp,i,num*t);

任务点到时间区间

if(st[j]<=tim[i-1]&&tim[i]<=ed[j])add(j,n+i,inf);
时间区间到汇点

add(n+i,tp,m*(tim[i]-tim[i-1]));

代码:

#include<cstring>  #include<cstdio>  #include<cmath>#include<iostream>#include<algorithm>#include<queue>#define N 1005 //估算点#define maxn 1<<26  #define inf 999999999using namespace std;  struct edge{    int u,v,w,next;}e[20*N];int n,m;int edn;  //边数 int head[N];int d[N];int sp,tp; //源点、汇点void add(int u,int v,int w){    e[edn].u=u;e[edn].v=v;e[edn].w=w;    e[edn].next=head[u];head[u]=edn++;    e[edn].u=v;e[edn].v=u;e[edn].w=0;    e[edn].next=head[v];head[v]=edn++;} int bfs(){    queue<int>q;    int i,j;    memset(d,-1,sizeof(d));    d[sp]=0;    q.push(sp);    while(!q.empty()){        int cur=q.front();        q.pop();        for(i=head[cur];~i;i=e[i].next){            int v=e[i].v;            if(d[v]==-1&&e[i].w>0){                d[v]=d[cur]+1;                q.push(v);            }        }    }    return d[tp]!=-1;//返回是否能够到达汇点 }int dfs(int a,int b){    int r=0;    int i;    if(a==tp)return b;    for(i=head[a];~i;i=e[i].next){        int v=e[i].v;        if(e[i].w>0&&d[v]==d[a]+1){            int x=min(e[i].w,b-r);            x=dfs(v,x);            r+=x;            e[i].w-=x;            e[i^1].w+=x;        }    }    if(!r)d[a]=-2;    return r;}int dinic(int sp,int tp){    int total=0;    int t;    while(bfs()){        while(t=dfs(sp,maxn)){            total+=t;        }    }    return total;}int st[N],ed[N],tim[N];int main(){    while(scanf("%d%d",&n,&m)!=EOF){        int i,j;        edn=0;        memset(head,-1,sizeof(head));        int sum=0;        sp=0;        int cnt=0;        for(i=1;i<=n;i++){            int num,t;            scanf("%d%d%d%d",&st[i],&num,&ed[i],&t);            tim[cnt++]=st[i];            tim[cnt++]=ed[i];            sum+=num*t;            add(sp,i,num*t);        }        sort(tim,tim+cnt);        cnt=unique(tim,tim+cnt)-tim;//去重        tp=n+cnt+1;        for(i=1;i<cnt;i++){            add(n+i,tp,m*(tim[i]-tim[i-1]));            for(j=1;j<=n;j++){                if(st[j]<=tim[i-1]&&tim[i]<=ed[j]){                    add(j,n+i,inf);                }            }        }         if(sum==dinic(sp,tp))printf("Yes\n");        else printf("No\n");        //printf("%d\n",dinic(sp,tp));    }     return 0;} 


原创粉丝点击