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一起用上找并更新增广路径,很犀利