题目链接:Flow Problem
题目大意:给你一张有向图,问你这张图从1到N的最大流
题目思路:直接套板子写最大流就好了
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1000+100;
const int MAXM = 1000000+10;
const int INF = 0x3f3f3f3f;
struct Edge{
int from, to, cap, flow, next;
}edge[MAXM];
int dist[MAXN], vis[MAXN], cur[MAXN], top, head[MAXN];
int n, m;
int sumflow;
int sink;
void init(){
top = 0;
memset(head, -1, sizeof(head));
}
void addedge(int u, int v, int w){
Edge E1 = {u, v, w, 0, head[u]};
edge[top] = E1;
head[u] = top++;
Edge E2 = {v, u, 0, 0, head[v]};
edge[top] = E2;
head[v] = top++;
}
bool BFS(int start, int End){
queue<int> Q;
memset(dist, -1, sizeof(dist));
memset(vis, 0, sizeof(vis));
while(!Q.empty()) Q.pop();
Q.push(start);
vis[start] = 1;
dist[start] = 0;
while(!Q.empty()){
int u = Q.front();
Q.pop();
for(int i = head[u]; i != -1; i = edge[i].next){
Edge E = edge[i];
if(!vis[E.to] && E.cap > E.flow){
vis[E.to] = 1;
dist[E.to] = dist[u] + 1;
if(E.to == End) return true;
Q.push(E.to);
}
}
}
return false;
}
int DFS(int x, int a, int End){
if(x == End || a == 0) return a;
int flow = 0, f;
for(int& i = cur[x]; i != -1; i = edge[i].next){
Edge& E = edge[i];
if(dist[E.to] == dist[x]+1 && (f = DFS(E.to, min(a, E.cap-E.flow), End)) > 0){
E.flow += f;
edge[i^1].flow -= f;
flow += f;
a -= f;
if(a == 0) break;
}
}
return flow;
}
int Dinic(int start, int End){
int flow = 0;
while(BFS(start, End)){
memcpy(cur, head, sizeof(head));
flow += DFS(start, INF, End);
}
return flow;
}
int main(){
int T,n,m,u,v,cost;
scanf("%d",&T);
for(int Case = 1;Case <= T;Case++){
init();
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d%d",&u,&v,&cost);
addedge(u,v,cost);
}
int Start = 1,End = n;
printf("Case %d: %d\n",Case,Dinic(Start,End));
}
return 0;
}