poj 2112 Optimal Milking

来源:互联网 发布:达内 专业硕士java 编辑:程序博客网 时间:2024/05/18 00:29

二分答案,然后每个长度做网络流。

由于输入恶心加上我比较菜...WA了好多次,最重要的是牛到机器建的应该是有向图,我建成无向图了。

import java.util.*;import java.io.*;class edge implements Comparable<edge>{    int from, to, len;    public edge(int a, int b, int c){        from=a;to=b;len=c;    }    @Override    public int compareTo(edge t) {        return this.len - t.len;    }    }class problem11{    int k,c,m;    int g[][];    ArrayList<edge> arr = new ArrayList<edge>();    int left=1,right=1;    int result;    int level[];    void solver() throws IOException{        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));        StringTokenizer st = new StringTokenizer(reader.readLine().trim());        k = Integer.valueOf(st.nextToken());        c = Integer.valueOf(st.nextToken());        m = Integer.valueOf(st.nextToken());        g = new int[k+c][k+c];        for(int i=0;i<k+c;i++){            for(int j=0;j<k+c;){                if(st.hasMoreTokens()){                    g[i][j] = Integer.valueOf(st.nextToken());                    if(g[i][j]==0&&i!=j) g[i][j] = 999999999;                    j++;                }else{                    st = new StringTokenizer(reader.readLine());                }            }        }        floyd();        for(int i=0;i<k+c;i++){            for(int j=0;j<k+c;j++){                if(g[i][j]>0&&g[i][j]<999999999){                    arr.add(new edge(i+1,j+1,g[i][j]));                    if(g[i][j]>right) right = g[i][j];                }            }        }        g = new int[k+c+2][k+c+2];        while(left<=right){            int mid = (left+right)/2;            for(int i=0;i<k+c+2;i++){                Arrays.fill(g[i], 0);            }            for(int i=0;i<arr.size();i++){                edge tmp = arr.get(i);                if(tmp.len<=mid&&tmp.from<=k&&tmp.to>k){                    g[tmp.from][tmp.to] = 1;                    //g[tmp.to][tmp.from] = 1;                }            }            for(int i=1;i<=k;i++){                g[0][i] = m;                g[i][0] = m;            }            for(int i=k+1;i<k+c+1;i++){                g[i][k+c+1] = 1;                g[k+c+1][i] = 1;            }            int flow = max_flow(0,k+c+1);            if(flow>=c){                result = mid;                right = mid-1;            }else{                left = mid+1;            }        }        System.out.println(result);    }    int max_flow(int s, int t){        int flow = 0;        while(bfs(s,t)){            flow+=dfs(s,t,Integer.MAX_VALUE);        }        return flow;    }    boolean bfs(int s, int t){        level = new int[k+c+2];        Arrays.fill(level, -1);        level[s] = 0;        Queue<Integer> q = new LinkedList<Integer>();        q.add(s);        while(!q.isEmpty()){            int tmp = q.poll();            for(int i=0;i<k+c+2;i++){                if(g[tmp][i]>0&&level[i]==-1){                    level[i]=level[tmp]+1;                    q.add(i);                }            }        }        return level[t]!=-1;    }    int dfs(int s, int t, int min){        if(s==t) return min;        int tmp = min;        for(int i=0;i<k+c+2;i++){            if(g[s][i]==0||level[i]!=level[s]+1) continue;            int d = dfs(i,t,Math.min(g[s][i], min));            g[s][i]-=d;            g[i][s]+=d;            min-=d;        }        return tmp-min;    }    void floyd(){        for(int i=0;i<k+c;i++){            for(int x=0;x<k+c;x++){                for(int y=0;y<k+c;y++){                    if(g[x][i]+g[i][y]<g[x][y])                        g[x][y] = g[x][i]+g[i][y];                }            }        }    }}public class fence8{    public static void main (String [] args) throws Exception {    problem11 p = new problem11();        p.solver();    }}


0 0
原创粉丝点击