裸题,可以用vector储存邻接表来使代码变得简洁。
输入新的一组测试数据的时候要记得清空。
下为Dinic算法的代码。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <string>
#include <map>
#include <queue>
#include <vector>
#define N 210
#define ll long long
#define INF 0x7fffffff
using namespace std;
struct Edge{
int from,to,cap,flow;
Edge(int a=0,int b=0,int c=0, int d=0){
from = a,to = b,cap = c,flow = d;
}
};
vector<Edge>edges;
vector<int>G[N];
int n,m,s,t;
void addedge(int from, int to,int cap){
edges.push_back(Edge(from,to,cap,0));
edges.push_back(Edge(to,from,0,0));
int m = edges.size();
G[from].push_back(m-2);
G[to].push_back(m-1);
}
bool vis[N];
int cur[N],deep[N];
bool bfs(){
memset(vis,0,sizeof(vis));
queue<int>que;
que.push(s);
deep[s] = 0;
vis[s] = 1;
while (!que.empty())
{
int x = que.front();que.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;deep[e.to] = deep[x]+1;
que.push(e.to);
}
}
}
return vis[t];
}
int dfs(int x,int a){
if(x == t || a == 0){
return a;
}
int flow = 0,f;
for(int& i = cur[x];i<G[x].size();i++){
Edge& e = edges[G[x][i]];
if(deep[x]+1 == deep[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;
}
ll Maxflow(){
ll flow = 0;
while (bfs())
{
memset(cur,0,sizeof(cur));
flow+=dfs(s,INF);
}
return flow;
}
int main()
{
int i,j,l,x,y,z;
while (~scanf("%d",&n))
{
for(i=0;i<=N;i++){
G[i].clear();
}
edges.clear();
scanf("%d",&m);
s = 1;t = m;
for(i=1;i<=n;i++){
scanf("%d%d%d",&x,&y,&z);
addedge(x,y,z);
}
printf("%lld\n",Maxflow());
}
return 0;
}