试题 算法训练 网络流裸题

试题 算法训练 网络流裸题

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  一个有向图,求1到N的最大流
输入格式
  第一行N M,表示点数与边数
  接下来M行每行s t c表示一条从s到t的容量为c的边
输出格式
  一个数最大流量
样例输入
6 10
1 2 4
1 3 8
2 3 4
2 4 4
2 5 1
3 4 2
3 5 2
4 6 7
5 4 6
5 6 3
样例输出
8

数据约定:
n<=1000 m<=10000

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
#define ll long long

const int INF = 0x3f3f3f3f;
const int maxn = 200000;
#define MAXN 200000


int n, m, s, t; // s是源点,t是汇点
bool vis[MAXN];
struct Edge
{
    int to,next;
    ll w;
}edges[maxn];
ll last[maxn],flow[maxn];


int head[maxn],cnt = 1;
inline void add(int from,int to,ll w)
{
    edges[++cnt].w = w;
    edges[cnt].to = to;
    edges[cnt].next = head[from];
    head[from] = cnt;
}
inline ll bfs()
{
    memset(last,-1,sizeof(last));
    queue<int> q;
    q.push(s);
    flow[s] = INF;
    while(!q.empty())
    {
        int p = q.front();
        q.pop();
        if(p==t) break;
        for(int eg=head[p]; eg; eg=edges[eg].next)
        {
            int to = edges[eg].to;
            ll vol = edges[eg].w;
            if(vol>0 && last[to]==-1)
            {
                last[to] = eg;
                flow[to] = min(flow[p],vol);
                q.push(to);
            }
        }
    }
    return last[t] != -1;
}
inline ll EK()
{
    ll maxflow = 0;
    while(bfs())
    {
        maxflow += flow[t];
        for(int i=t; i!=s; i=edges[last[i]^1].to)
        {
            edges[last[i]].w -= flow[t];
            edges[last[i]^1].w += flow[t];
        }
    }
    return maxflow;
}
int main(){

    cin>>n>>m;
    s= 1; t = n;

    for(int i=1; i<=m; ++i){
        int u,v;
        ll w;
        cin>>u>>v>>w;
        add(u,v,w);
        add(v,u,0);
    }
    cout<<EK()<<endl;
    return 0;
}

上一篇:odoo模型和视图的继承


下一篇:js加载优化-二