小红书第三题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;
}
}
#小红书笔试#

