网络流男女配对问题java实现

package test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

public class ReadFromFile {
	public static boolean hasPath(int rGraph[][], int s, int t, int path[],int V) {
    	boolean visited[] = new boolean[V];
        Queue<Integer> queue = new LinkedList<Integer>();
        queue.add(s);
        visited[s] = true;
        //标准的BFS算法
        while(queue.size() > 0){
            int top = queue.poll();
            for(int i=0; i<V; i++){
                if(!visited[i] && rGraph[top][i] > 0){
                    queue.add(i);
                    visited[i] = true;
                    path[i] = top;
                }
           }
        }
        return visited[t] == true;
    }
	
	 private static int maxFlow(int[][] graph,int s, int t,int V) {
	    	
	        int rGraph[][]=new int[V][V];
	        for(int i=0; i<V; i++)
	            for(int j=0; j<V; j++)
	               rGraph[i][j] = graph[i][j];
	 
	        int maxFlow = 0;
	        int path[] = new int[V];
	        while(hasPath(rGraph, s, t, path,V)){
	            int min_flow = Integer.MAX_VALUE;
	           //更新路径中的每条边,找到最小的流量
	            for(int v=t; v != s; v=path[v]){
	                int u = path[v];
	                min_flow = Math.min(min_flow, rGraph[u][v]);
	            }
	            //更新路径中的每条边
	            for(int v=t; v != s; v=path[v]){
	                int u = path[v];
	                rGraph[u][v] -= min_flow;
	                rGraph[v][u] += min_flow;
	            }
	            maxFlow += min_flow;
	        }
	       return maxFlow;
	    }
	
	public static ArrayList<ArrayList<Integer>> readFileByLines(String filename) {
		File file=new File(filename);
		BufferedReader reader=null;
		ArrayList<ArrayList<Integer>> list=new ArrayList<ArrayList<Integer>>();
		
		System.out.println("已字节为单位读取内容,一次读一行:");
		try {
			reader=new BufferedReader(new FileReader(filename));
			String tempstring=null;
			int line=1;
			
			while ((tempstring=reader.readLine())!=null) {
				//System.out.println("line"+line+":"+tempstring);
				ArrayList<Integer>list2=new ArrayList<Integer>();
				String[] str=null;
				str=tempstring.split(" ");
				for (int i = 0; i < str.length; i++) {
					list2.add(Integer.parseInt(str[i]));
				}
				list.add(list2);
				line++;
			}
			
			reader.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

	public static void FindAllMaxFlow(ArrayList<ArrayList<Integer>> list) {
		
		while(list.size()!=0){
			ArrayList<Integer>list1;
			list1=list.get(0);
			list.remove(0);
			int a=list1.get(0);
			int b=list1.get(1);
			int[][] temp=new int[a+b+2][a+b+2];
			for (int k=1;k<=a;k++){
				temp[0][k]=1;
			}
			for(int k=1;k<=b;k++)
				temp[a+k][a+b+2-1]=1;
			
			for (int k = 0; k < a; k++) {
				list1=list.get(0);
				for (int r = 0; r < list1.get(0); r++) {
					int m=list1.get(r+1);
					temp[1+k][a+m]=1;				
				}	
				list.remove(0);
			}
			int V=temp.length;
            System.out.println(maxFlow(temp, 0, V-1, V));
		}
		
	}
	
	public static void main(String[] args) {
        ArrayList<ArrayList<Integer>>list=new ArrayList<>();
        list=readFileByLines("problem1.data");
		FindAllMaxFlow(list);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值