二分图(Java)

来源:互联网 发布:mac air app 编辑:程序博客网 时间:2024/06/05 23:39
//对于节点数目不同可以处理,//Java语言实现,最基础未优化public class ErFenTu {public static int m = 50;public static int n = 100;public static int[] lx = new int[m];public static int[] ly = new int[n];public static boolean[] sx = new boolean[m];public static boolean[] sy = new boolean[n];public static int[] cx = new int[n];//x对应y的坐标public static int[] match = new int[n];//大小为n(y对应x的坐标)public static int[][] weight;                public static boolean path(int u){//范围到m        sx[u] = true;        for(int v = 0; v < n; v++){            if(!sy[v] && lx[u] + ly[v] == weight[u][v]){                sy[v] = true;                if(match[v] == -1 || path(match[v])){                    cx[u] = v;                    match[v] = u;                    return true;                }            }        }        return false;    }        public static int bestMatch(boolean maxsum){        if(!maxsum){            for(int i = 0; i < m; i++){                for(int j = 0; j < n; j++){                    weight[i][j] = - weight[i][j];                }            }        }        for(int i = 0; i < m; i++){            lx[i] = Integer.MIN_VALUE;            for(int j = 0; j < n; j++){                if(lx[i] < weight[i][j]){                    lx[i] = weight[i][j];                 }            }        }        for(int i = 0; i < n; i++){            ly[i] = 0;            match[i] = -1;        }                for(int u = 0; u < m; u++){            while(true){                for(int i = 0; i < m; i++){                    sx[i] = false;                 }                for(int i = 0; i < n; i++){                    sy[i] = false;                }                if(path(u)){                    break;                }                //修改标号                int dx = Integer.MAX_VALUE;                for(int i = 0; i < m; i++){                    if(sx[i]){                        for(int j = 0; j < n; j++){                            if(!sy[j]){                                dx = Math.min(lx[i] + ly[j] - weight[i][j], dx);                            }                        }                    }                }                for(int i = 0; i < m; i++){                    if(sx[i]){                        lx[i] -= dx;                    }                }                for(int i = 0; i < n; i++){                    if(sy[i]){                        ly[i] += dx;                    }                }            }        }//        for(int i = 0; i < n; i++){//            System.out.println(match[i]);//        }        int sum = 0;         for(int i = 0; i < n; i++){            if(match[i] != -1){                sum += weight[match[i]][i];            }                    }        if(!maxsum){            sum = -sum;            for(int i = 0; i < m; i++){                for(int j = 0; j < n; j++){                    weight[i][j] = -weight[i][j];                }            }        }        return sum;    }}

0 0
原创粉丝点击