二分图匹配
Posted brilliant107
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分图匹配相关的知识,希望对你有一定的参考价值。
A - 最大匹配
题意:一共有N个学生跟P门课程,一个学生可以任意选一门或多门课,问是否可行。
1.每个学生选的都是不同的课(即不能有两个学生选同一门课)
2.每门课都有一个代表(即P门课都被成功选过)
题解:就是匈牙利算法啦(题目输入和处理有点毒),还有最后输出大写YES。。。。
1 var 2 map:array[0..600,0..600]of longint; 3 mx,my:array[0..2000] of longint; 4 vis:array[0..2000] of boolean; 5 p,m,t,i,l,ans,x,j,y:longint; 6 7 function dfs(s:longint):boolean; 8 var i:longint; 9 begin 10 for i:=1 to m do 11 begin 12 if (map[s,i]=1)and(not vis[i]) then 13 begin 14 vis[i]:=true; 15 if (my[i]=0)or(dfs(my[i])) then//当前这个点未被访问或者是一条增广路 16 begin 17 mx[s]:=i;// 左边点s对应右边点i 18 my[i]:=s; 19 exit(true);//可行返回true 20 end; 21 end; 22 end; 23 exit(false); 24 end; 25 begin 26 readln(t); 27 for l:=1 to t do 28 begin 29 fillchar(map,sizeof(map),0); 30 fillchar(mx,sizeof(mx),0); 31 fillchar(my,sizeof(my),0); 32 readln(p,m); 33 for i:=1 to p do 34 begin 35 read(x); 36 for j:=1 to x do 37 begin 38 read(y); 39 map[i,y]:=1; 40 end; 41 readln; 42 end; 43 44 ans:=0; 45 for i:=1 to p do//用课程匹配学生 46 begin 47 fillchar(vis,sizeof(vis),false); 48 if dfs(i) then inc(ans); 49 end; 50 51 if ans=p then writeln(‘YES‘) else writeln(‘NO‘); 52 end; 53 end.
以上是关于二分图匹配的主要内容,如果未能解决你的问题,请参考以下文章