版权声明: https://blog.csdn.net/King8611/article/details/81700906
这道题也是模板的网络流问题,但是要注意一点的是,这道题有重边,建边的时候要把重边加上就好了。
这是我的JAVA代码:
其中,这个板子我在https://blog.csdn.net/King8611/article/details/81171248有一些注释。
import java.io.*;
import java.util.*;
public class Main {
static int n,m;
static int map[][];
static int pre[];
static boolean vis[];
static int s,t;
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String args[]) throws IOException {
map=new int[300][300];
pre=new int[300];
vis=new boolean[300];
while(in.nextToken()!=in.TT_EOF) {
m=(int) in.nval;
n=getInt();
init();
for(int i=0;i<m;i++) {
int a=getInt();
int b=getInt();
int c=getInt();
map[a][b]+=c;
}
System.out.println(ff());
}
}
static boolean bfs() {
int cur;
LinkedList<Integer> q=new LinkedList<Integer>();
for(int j=0;j<=n;j++) {
pre[j]=0;
vis[j]=false;
}
vis[s]=true;
q.offer(s);
while(!q.isEmpty()) {
cur=q.poll();
if(cur==t)return true;
for(int i=1;i<=n;i++) {
if(!vis[i]&&map[cur][i]!=0) {
q.offer(i);
vis[i]=true;
pre[i]=cur;
}
}
}
return false;
}
static long ff() {
long ans=0;
while(bfs()) {
int min=Integer.MAX_VALUE;
for(int i=t;i!=s;i=pre[i]) {
min=Math.min(min, map[pre[i]][i]);
}
for(int i=t;i!=s;i=pre[i]) {
map[i][pre[i]]+=min;
map[pre[i]][i]-=min;
}
ans+=min;
}
return ans;
}
static int getInt() throws IOException {
in.nextToken();
return (int) in.nval;
}
static String getString() throws IOException {
in.nextToken();
return in.sval;
}
static void init() {
s=1;
t=n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=0;
}
}