オリジナルタイトルリンク
①。タイトル
②。考える
- マッチング:グラフ理論では、「マッチング」はエッジのセットであり、任意の2つのエッジに共通の頂点がありません。
- 最大一致:グラフ内のすべての一致の中で、最も一致するエッジとの一致は、このグラフの最大一致と呼ばれます。
- 完全一致:すべての頂点がグラフの特定の一致の一致点である場合、それは完全一致です。
- 代替道路:一致しないポイントから開始して、一致しないエッジ、一致するエッジ、一致しないエッジなどを連続して通過することによって形成されるパスは、代替パスと呼ばれます。
- 拡張道路:不一致のポイントから開始し、代替道路を進みます。別の不一致のポイントを通過する場合(開始点はカウントされません)、この代替道路は拡張道路と呼ばれます。
③。学習ポイント
匈牙利算法
④。コードの実装
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
static int N=510,M=100010;
static int[] h=new int[M];
static int[] e=new int[M];
static int[] ne=new int[M];
static int idx;
static int[] match=new int[N];
static boolean[] st=new boolean[N];
static void add(int u,int v) {
e[idx]=v;
ne[idx]=h[u];
h[u]=idx++;
}
static boolean find(int u) {
for(int i=h[u];i!=-1;i=ne[i]) {
int j=e[i];
if(!st[j]) {
st[j]=true;
if(match[j]==0||find(match[j])) {
match[j]=u;
return true;
}
}
}
return false;
}
public static void main(String[] args) throws IOException {
Arrays.fill(h,-1);
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String[] arr=in.readLine().split(" ");
int n1=Integer.parseInt(arr[0]);
int n2=Integer.parseInt(arr[1]);
int m=Integer.parseInt(arr[2]);
while(m-->0){
String[] num=in.readLine().split(" ");
int u=Integer.parseInt(num[0]);
int v=Integer.parseInt(num[1]);
add(u,v);
}
int res=0;
for(int i=1;i<=n1;i++) {
Arrays.fill(st, false);
if(find(i)) {
res++;
}
}
System.out.println(res);
}
}