您的位置:首页 > 其它

Task Schedule HDU - 3572 + Alice's Chance POJ - 1698

2017-09-29 13:12 281 查看
点击打开链接

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

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

poj上还有一道基本一样的

hdu 3572

#include <bits/stdc++.h>
using namespace std;
#define N 1e9struct 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 1e9

struct 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: