Task Schedule HDU

来源:互联网 发布:php数组添加键值对 编辑:程序博客网 时间:2024/06/06 07:36

点击打开链接

hdu这个题卡时间 之前的EK和dinic板子根本过不了 才换成了isap

但是对isap还有一些不理解的地方 留个坑吧..

poj上还有一道基本一样的


hdu 3572

#include <bits/stdc++.h>using namespace std;#define N 1e9
struct node{    int v;    int w;    int next;};
node edge[200010];int first[200010],dis[200010],gap[200010],cur[200010],pre[200010];int t,n,m,ss,num,ee,ans;
void addedge(int u,int v,int w){    edge[num].v=v;    edge[num].w=w;    edge[num].next=first[u];    first[u]=num++;    return;}
void isap();void bfs();
int main(){    int t,cas,sum,i,j,p,s,e;    scanf("%d",&t);    cas=1;    while(t--)    {        scanf("%d%d",&n,&m);        memset(first,-1,sizeof(first));        num=0,ss=n+500+1,ee=n+500+2,sum=0;        for(i=1;i<=n;i++)        {            scanf("%d%d%d",&p,&s,&e);            sum+=p;            addedge(ss,i,p);            addedge(i,ss,0);            for(j=n+s;j<=n+e;j++)            {                addedge(i,j,1);                addedge(j,i,0);            }        }        for(i=n+1;i<=n+500;i++)        {            addedge(i,ee,m);            addedge(ee,i,0);        }        num=n+500+2;        isap();        if(ans==sum) printf("Case %d: Yes\n\n",cas++);        else printf("Case %d: No\n\n",cas++);    }    return 0;}
void isap(){    int j,u,v,flow,minn;    bfs();    memcpy(cur,first,sizeof(first));    memset(pre,-1,sizeof(pre));    ans=0,u=ss,flow=N;    while(dis[ss]<num)    {        int &i=cur[u];        for(;i!=-1;i=edge[i].next)        {            v=edge[i].v;            if(dis[v]+1==dis[u]&&edge[i].w>0)            {                pre[v]=i;                u=v,flow=min(flow,edge[i].w);                if(u==ee)                {                    while(u!=ss)                    {                        j=pre[u];                        edge[j].w-=flow;                        edge[j^1].w+=flow;                        u=edge[j^1].v;                    }                    ans+=flow,flow=N;                }                break;            }        }        if(i==-1)        {            if(--gap[dis[u]]==0) break;            cur[u]=first[u];            minn=num-1;            for(j=first[u];j!=-1;j=edge[j].next)            {                if(edge[j].w>0)                {                    minn=min(minn,dis[edge[j].v]);                }            }            dis[u]=minn+1;            gap[dis[u]]++;            if(u!=ss)            {                u=edge[pre[u]^1].v;            }        }    }    return;}
void bfs(){    queue <int> que;    int i,u,v;    memset(dis,-1,sizeof(dis));    memset(gap,0,sizeof(gap));    que.push(ee);    dis[ee]=0;    while(!que.empty())    {        u=que.front();        que.pop();        gap[dis[u]]++;        for(i=first[u];i!=-1;i=edge[i].next)        {            v=edge[i].v;            if(dis[v]==-1)            {                dis[v]=dis[u]+1;                que.push(v);            }        }    }    return;}


poj 1698

#include <stdio.h>#include <queue>#include <cstring>#include <algorithm>using namespace std;#define N 1e9struct node{    int v;    int w;    int next;};node edge[100010];int first[1010],dis[1010],gap[1010],cur[1010],pre[1010];int n,num,ss,ee,ans;void addedge(int u,int v,int w){    edge[num].v=v;    edge[num].w=w;    edge[num].next=first[u];    first[u]=num++;    return;}void isap();void bfs();int main(){    int film[10];    int t,i,j,k,d,w,sum;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        memset(first,-1,sizeof(first));        num=0,ss=n+350+1,ee=n+350+2,sum=0;        for(i=1;i<=n;i++)        {            for(j=1;j<=7;j++)            {                scanf("%d",&film[j]);            }            scanf("%d%d",&d,&w);            sum+=d;            addedge(ss,i,d);            addedge(i,ss,0);            for(j=0;j<w;j++)            {                for(k=n+j*7+1;k<=n+j*7+7;k++)                {                    if(film[k-n-j*7]==1)                    {                        addedge(i,k,1);                        addedge(k,i,0);                    }                }            }        }        for(i=n+1;i<=n+350;i++)        {            addedge(i,ee,1);            addedge(ee,i,0);        }        num=n+350+2;        isap();        if(ans>=sum) printf("Yes\n");        else printf("No\n");    }    return 0;}void isap(){    int j,u,v,flow,minn;    bfs();    memcpy(cur,first,sizeof(first));    memset(pre,-1,sizeof(pre));    ans=0,u=ss,flow=N;    while(dis[ss]<num)    {        int &i=cur[u];        for(;i!=-1;i=edge[i].next)        {            v=edge[i].v;            if(dis[v]+1==dis[u]&&edge[i].w>0)            {                pre[v]=i;                u=v,flow=min(flow,edge[i].w);                if(u==ee)                {                    while(u!=ss)                    {                        j=pre[u];                        edge[j].w-=flow;                        edge[j^1].w+=flow;                        u=edge[j^1].v;                    }                    ans+=flow,flow=N;                }                break;            }        }        if(i==-1)        {            if(--gap[dis[u]]==0) break;            cur[u]=first[u];            minn=num-1;            for(j=first[u];j!=-1;j=edge[j].next)            {                if(edge[j].w>0)                {                    minn=min(minn,dis[edge[j].v]);                }            }            dis[u]=minn+1;            gap[dis[u]]++;            if(u!=ss)            {                u=edge[pre[u]^1].v;            }        }    }    return;}void bfs(){    queue <int> que;    int i,u,v;    memset(dis,-1,sizeof(dis));    memset(gap,0,sizeof(gap));    que.push(ee);    dis[ee]=0;    while(!que.empty())    {        u=que.front();        que.pop();        gap[dis[u]]++;        for(i=first[u];i!=-1;i=edge[i].next)        {            v=edge[i].v;            if(dis[v]==-1)            {                dis[v]=dis[u]+1;                que.push(v);            }        }    }    return;}