.
题意:在一个有向图中,有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);
}