zoukankan      html  css  js  c++  java
  • 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;
    } 
  • 相关阅读:
    javaweb
    反射 day1
    JDBC-day1
    总结
    day5
    day4
    day3
    18.10.17 考试总结
    洛谷P2172 [bzoj] 2150 部落战争
    18.10.15 考试总结
  • 原文地址:https://www.cnblogs.com/dfsac/p/6819727.html
Copyright © 2011-2022 走看看