POJ 2455 Secret Milking Machine (最大流)

来源:互联网 发布:苹果怎样下载软件 编辑:程序博客网 时间:2024/05/19 16:47

题意:找出从1点到第n点的T条路,求这些路的最长边的最小值。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <stack>using namespace std;const int N = 209<<1;const int M = 40009<<1;const int INF = 0x3f3f3f3f;struct LT{    int l,r,dis;} L[M];int cnt=0;void add(int f,int t,int dis){    L[cnt].dis = dis;    L[cnt].r = t,L[cnt].l = f;    cnt++;}int g[N][N],gap[N],dist[N],pre[N],cur[N];int n,m,t;int sap(int s1,int t1,int n){    int ret = 0,aug = INF,u,v;    memset(gap,0,sizeof(gap));    memset(dist,0,sizeof(dist));    for(int i=0;i<=n;i++) cur[i] = 1;    u = pre[s1] = s1;    gap[0] = n;    while(dist[s1]<=n){    loop:        for(v = cur[u];v<=n;v++)        if(g[u][v]>0&&dist[u] ==dist[v]+1)        {            cur[u] = v;aug = min(aug,g[u][v]);            pre[v] = u;            u = v;            if(u==t1){                ret+=aug;                for(u=pre[u];v!=s1;v=u,u=pre[u])                g[u][v]-=aug,g[v][u]+=aug;                aug = INF;            }            goto loop;        }        int mind =n;        for(v=1;v<=n;v++)        if(g[u][v]>0&&mind>dist[v])        mind = dist[v],cur[u] = v;        if(--gap[dist[u]]<=0) break;        gap[dist[u]=mind+1]++;        u=pre[u];    }return ret;}void solve(int u,int T){    int l = 0,r = INF,mid;    int n = u,s=1,t=u,ans=INF;    while(l<=r)    {        mid = (l+r)>>1;        memset(g,0,sizeof(g));        for(int i=0;i<cnt;i++)        if(L[i].dis<=mid)        g[L[i].l][L[i].r]++;        int k = sap(s,t,n);        if(k>=T)        ans = mid,r = mid-1;        else l = mid+1;    }    printf("%d\n",ans);}int main(){    freopen("in.txt","r",stdin);    int a,b;int l,r,d;    scanf("%d%d%d",&a,&b,&t);    for(int i=0;i<b;i++)    {        scanf("%d%d%d",&l,&r,&d);        add(l,r,d);        add(r,l,d);    }    solve(a,t);    return 0;}