题目:
http://codevs.cn/problem/1993/
显然这道题是一道不用建模的裸dinic(好多网络流根本不知道是网络流啊233,可能是我太弱)
就是裸的我就不bb了,这里正向边和反向边我是用的x和x^1来存储的,代码不算长吧,关于dinic,如果需要复习或者不懂的,可以看这篇博文:
https://comzyh.com/blog/archives/568/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#define MAXN 500+10
#define oo 0x7ffffff
using namespace std;
struct Line{
int from,to,next,cost;
}line[MAXN];
int head[MAXN],tail,level[MAXN],n,m,te,mp,temp;
int s=1,t,cnt;
void add_line(int from,int to,int fee){
tail++;
line[tail].from=from;
line[tail].to=to;
line[tail].cost=fee;
line[tail].next=head[from];
head[from]=tail;
}
bool bfs(){
memset(level,0xff,sizeof(level));
queue<int>q;
level[s]=0;q.push(s);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=line[i].next){
int v=line[i].to;
if(line[i].cost>0&&level[v]==-1){
level[v]=level[u]+1;
q.push(v);
}
}
}
if(level[t]==-1) return false;
return true;
}
int dfs(int u,int maxflow){
if(u==t) return maxflow;
for(int i=head[u];i;i=line[i].next){
int v=line[i].to;
if(line[i].cost>0&&level[u]<level[v]){
int flow=dfs(v,min(maxflow,line[i].cost));
if(flow>0){
line[i].cost-=flow;
line[i^1].cost+=flow;
return flow;
}
}
}
return 0;
}
int main(){
scanf("%d%d",&n,&m);t=m;
for(int i=1;i<=n;i++){
scanf("%d%d%d",&te,&mp,&temp);
add_line(te,mp,temp);
add_line(mp,te,0);
}
while(bfs()) cnt+=dfs(s,oo);
cout<<cnt;
return 0;
}