直接改下模板就可以了...
这个题的数组好像要开的比题目大一些才行
代码如下:
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAXN 500//点的最大个数
#define MAXM 500//边的最大个数
#define LL long long
#define INF 0x7fffffff
using namespace std;
int n, m;
struct Edge {
int from, to, cap, flow;
};
struct Dinic {
int m, n, s, t;
vector<Edge> edges;
vector<int> G[MAXN]; //邻接表,G[i][j]表示节点 i 的第 j 条边在 e 数组中的序号
bool vis[MAXN]; //BFS使用
int d[MAXN]; //从起点到 i 的距离
int cur[MAXM]; //当前弧下标
void AddEdge(int from, int to, int cap) {
Edge e;
e.from = from; e.to = to; e.cap = cap; e.flow = 0;
edges.push_back(e);
e.from = to; e.to = from; e.cap = 0; e.flow = 0;
edges.push_back(e);
m = edges.size();
G[from].push_back(m-2);
G[to].push_back(m-1);
}
bool BFS() {
memset(vis, 0, sizeof(vis));
memset(d, 0, sizeof(d));
queue<int> Q;
Q.push(s);
d[s] = 0;
vis[s] = 1;
while(!Q.empty()) {
int x = Q.front();
Q.pop();
for(int i=0; i<G[x].size(); ++i) {
Edge &e = edges[G[x][i]];
if(!vis[e.to] && e.cap>e.flow) {
vis[e.to] = 1;
d[e.to] = d[x]+1;
Q.push(e.to);
}
}
}
return vis[t];
}
int DFS(int x, int a) {
if(x==t || a==0)
return a;
int f, flow = 0;
for(int &i=cur[x]; i<G[x].size(); ++i) {
Edge &e = edges[G[x][i]];
if(d[x]+1==d[e.to] && (f=DFS(e.to, min(a, e.cap-e.flow))) > 0) {
e.flow += f;
edges[G[x][i]^1].flow -= f;
flow += f;
a -= f;
if(a == 0)
break;
}
}
return flow;
}
int Maxflow(int s, int t) { //求 s 到 t 的最大流
this->s = s;
this->t = t;
int flow = 0;
while(BFS()) {
memset(cur, 0, sizeof(cur));
flow += DFS(s, INF);
}
return flow;
}
}dinic;
int main(void) {
int T, t, x, y, c;
while(scanf("%d%d", &m, &n) != EOF) {
//init()
dinic.edges.clear();
for(int i=0; i<MAXN; ++i)
dinic.G[i].clear();
while(m--) {
scanf("%d%d%d", &x, &y, &c);
dinic.AddEdge(x, y, c);
}
cout << dinic.Maxflow(1, n) << endl;
}
return 0;
}