小红书第三题AK代码,最大匹配数(也就是匈牙利算法)
import java.util.*; public class Main { //感觉是用二分图的完美匹配去做 public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int[] a=new int[n]; Node[] node=new Node[n+1]; boolean[] visit=new boolean[n+1]; for(int i=0;i<=n;i++){ node[i]=new Node(); node[i].idx=i; } for(int i=0;i<n-1;i++){ a[i]=sc.nextInt(); node[i+2].list.add(node[a[i]]); node[a[i]].list.add(node[i+2]); } int res=0; for(int i=1;i<=n;i++){ if(visit[i]) continue; if(node[i].curlink==null){ Node link=node[i].find(visit); if(link!=null){ node[i].curlink=link; node[link.idx].curlink=node[i]; visit[i]=true; visit[link.idx]=true; res++; } } } System.out.println(res); } } class Node{ List<Node> list=new ArrayList<>(); int idx; Node curlink; public Node find(boolean[] visit){ for(Node node:list){ if(node.curlink==null){ return node; }else{ if(dfs(node.curlink,visit)){ return node; } } } return null; } public boolean dfs(Node o,boolean[] visit){ for(Node node:o.list){ if(node.curlink==null){ node.curlink=o; o.curlink=node; visit[o.idx]=true; visit[node.idx]=true; return true; } } return false; } }
#小红书笔试#