Fork me on GitHub

P1341 地震逃生

https://www.luogu.org/problem/show?pid=1343#sub

最大流

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#define INF 100000000
using namespace std;
int n,m,x;
int flow[10009];
struct P{
    int f,id;
}pre[10009];
struct H{
    int to,cap,rev;
};
vector <H> v[10009];
void add(int f,int t,int c)
{
    v[f].push_back((H){t,c,v[t].size()});
    v[t].push_back((H){f,0,v[f].size()-1});
}
queue <int> que;
int bfs(int s,int t)
{   
    while(!que.empty()) que.pop();

    for(int i=1;i<=n;i++) pre[i].f=-1;
    pre[s].f=0;
    flow[s]=INF;
    que.push(s);
    while(!que.empty())
    {
        int k=que.front();
        que.pop();
        if(k==t) break;

        for(int i=0;i<v[k].size();i++)
        {
            H &tmp=v[k][i];
            if(tmp.to!=s&&tmp.cap>0&&pre[tmp.to].f==-1)
            {
                pre[tmp.to].f=k,pre[tmp.to].id=i;
                flow[tmp.to]=min(tmp.cap,flow[k]);
                que.push(tmp.to);
            }
        } 
    }
    return pre[t].f==-1?-1:flow[t];
}
int maxflow(int s,int t)
{
    int mflow=0,d;
    while((d=bfs(s,t))!=-1)
    {
        mflow+=d;
        int k=t;
        while(k!=s)
        {
            int p=pre[k].f;
            v[p][pre[k].id].cap-=d;
            v[k][v[p][pre[k].id].rev].cap+=d;//利用反向边 
            k=p;
        }
    }
    return mflow;
}
int main()
{
    scanf("%d%d%d",&n,&m,&x);
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
    }
    int p=maxflow(1,n);
    if(!p) {
        printf("Orz Ni Jinan Saint Cow!");
        return 0;
    } 
    int ans=0;
    if(x%p!=0) ans=1;
    printf("%d %d",p,ans+x/p);
    return 0;
} 
posted @ 2017-04-23 09:06  primes  阅读(128)  评论(0编辑  收藏  举报