poj 3084 Dinic

来源:互联网 发布:mac终端命令保存退出 编辑:程序博客网 时间:2024/06/02 03:37
import java.util.*;public class Main {    public static int nodes, sink;    public static int[][] map = new int[30][30];    public static int[] level = new int[30];    public static StringBuilder sb = new StringBuilder();        public static boolean bfs(){        Arrays.fill(level, -1);        Queue<Integer> q = new LinkedList<Integer>();        q.add(nodes);        level[nodes] =0;        while(!q.isEmpty()){            int tmp = q.poll();            for(int i=0;i<=nodes;i++){                if(level[i]==-1&&map[tmp][i]>0){                    level[i] = level[tmp]+1;                    q.add(i);                }            }        }        return level[sink] != -1;    }        public static int dfs(int start_node, int cap){        int tmp = cap;        if(start_node==sink)            return cap;        for(int i=0;i<=nodes;i++){            if(level[i]==level[start_node]+1 &&tmp>0&&map[start_node][i]>0){                int flow = dfs(i,Math.min(tmp, map[start_node][i]));                map[start_node][i]-=flow;                map[i][start_node]+=flow;                tmp-=flow;            }        }        return cap - tmp;    }    public static void dinic(){        int result=0;        while(bfs()){            result+=dfs(nodes,10000000);        }        if(result<10000000){            sb.append(result).append("\n");        }else{            sb.append("PANIC ROOM BREACH\n");        }    }    public static void main(String[] args) throws Exception {        Scanner scan = new Scanner(System.in);        int cases = scan.nextInt();        for(int i=0;i<cases;i++){            map = new int[30][30];             nodes = scan.nextInt();            sink = scan.nextInt();            for(int j=0;j<nodes;j++){                if(scan.next().equals("I")){                    map[nodes][j] = 10000000;                }                int num = scan.nextInt();                while(num-->0){                    int t = scan.nextInt();                    map[j][t] = 10000000;                    map[t][j]++;                }            }            dinic();        }        System.out.println(sb.toString());    }}


这个Dinic我认为算是写的比较清楚的了,当然也参考了Dinic的模板,第一次写我可写不出这样的代码

Dinic把BFS, DFS一起用上找并更新增广路径,很犀利

原创粉丝点击