POJ-1273

版权声明: 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;
	}
}

猜你喜欢

转载自blog.csdn.net/King8611/article/details/81700906
今日推荐