tkj
文章143
标签102
分类0
bzoj 1570: [JSOI2008]Blue Mary的旅行

bzoj 1570: [JSOI2008]Blue Mary的旅行

.

题意:在一个有向图中,有t个人从1号点走到n号点,每条边有容量,每天可以走1条边,问最快几天可以全部到达n号点。
题解:一开始读错题了。。枚举答案,分层建图跑最大流就好
数组开小调了一下午QAQ
代码:

#include<bits/stdc++.h>
using namespace std;

int n,m,k,num=1,fst[5510],s,t,h[5510],Num=0,ans=0;
struct edge
{
    int x,y,d,n;
}e[2000010],E[2460];
const int inf=1<<30;

void ins(int x,int y,int d)
{
    e[++num]={x,y,d,fst[x]};
    fst[x]=num;
}
void Ins(int x,int y,int d)
{
    E[++Num]={x,y,d,0};
}
bool bh()
{
    memset(h,0,sizeof(h));
    static queue<int>q;
    q.push(s);
    h[s]=1;
    while(!q.empty())
    {
        int x=q.front();
        for(int i=fst[x];i;i=e[i].n)
        {
            int y=e[i].y;
            if(e[i].d&&!h[y])
            {
                h[y]=h[x]+1;
                q.push(y);
            }
        }
        q.pop();
    }
    return h[t];
}
int fd(int x,int f)
{
    if(x==t)
    return f;
    int s=0;
    for(int i=fst[x];i;i=e[i].n)
    {
        int y=e[i].y;
        if(e[i].d&&h[y]==h[x]+1&&s<f)
        {
            int t=fd(y,min(f-s,e[i].d));
            e[i].d-=t;
            e[i^1].d+=t;
            s+=t;
        }
    }
    if(!s)
    h[x]=0;
    return s;
}
bool chk(int x)
{
    int hh=n*(x-1),oo=n*x;
    for(int i=1;i<=Num;i++)
    {
        ins(E[i].x+hh,E[i].y+oo,E[i].d);
        ins(E[i].y+oo,E[i].x+hh,0);
    }
    for(int i=1;i<=n;i++)
    {
        ins(i+hh,i+oo,inf);
        ins(i+oo,i+hh,0);
    }
    ins(n+oo,t,inf);
    ins(t,n+oo,0);
    while(bh())
    ans+=fd(s,inf);
    return ans>=k;
}
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=0;i<m;i++)
    {
        int x,y,d;
        scanf("%d%d%d",&x,&y,&d);
        Ins(x,y,d);
    }
    int ans=1;
    s=0;
    t=n*(n+k+1)+1;
    ins(s,1,k);
    ins(1,s,0);
    while(!chk(ans))
    ans++;
    printf("%d",ans);
}
本文作者:tkj
本文链接:https://tkj666.github.io/21/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可