题目大意:

这些英文题真是有点长,意思我也是读个半懂不懂,但是好像就应该是一个魔板题。给你 n(200)个点 m(200)条边,然后就是问你求一个从 1 号点到 n 号点的最大流。
没有什么巧妙建图的需要。第一次直接套魔板真是爽,但是要记住每组测试数据之间需要初始化。

代码:

#include<iostream>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
#define maxn 510
#define inf 0x3f3f3f3f

using namespace std;

struct Edge
{
    int s;int e;int v;
}a[maxn];


//int map[maxn][maxn]={0};

int n,m;
//int map[maxn][maxn];
struct edge
{
    int to,cap,rev;
};
vector<edge>G[maxn];
bool used[maxn];
void add_edge(int from,int to,int cap)
{
    G[from].push_back((edge){to,cap,G[to].size()});
    G[to].push_back((edge){from,0,G[from].size()-1});
}
int dfs(int v,int t,int f)
{
    if(v==t)return f;
    used[v]=true;
    for(int i=0;i<G[v].size();i++)
    {
        edge &e=G[v][i];
        if(!used[e.to]&&e.cap>0)
        {
            int d=dfs(e.to,t,min(f,e.cap));
            if(d>0)
            {
                e.cap-=d;
                G[e.to][e.rev].cap+=d;
                return d;
            }
        }
    }
    return 0;
}
int max_flow(int s,int t)
{
    int flow=0;
    while(1)
    {
        memset(used,0,sizeof(used));
        int f=dfs(s,t,inf);
        if(f==0)return flow;
        flow+=f;
    }
}


int main()
{
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        memset(a,0,sizeof(a));
        //init(n);
        for(int i=0;i<maxn;i++)G[i].clear();
        for(int i=1;i<=m;i++)
        {
            int la,lb,lc;
            scanf("%d%d%d",&la,&lb,&lc);
            la--;lb--;
            add_edge(la,lb,lc);
            add_edge(lb,la,0);
        }
        printf("%d\n",max_flow(0,n-1));
    }
    return 0;
}