码迷,mamicode.com
首页 > 其他好文 > 详细

二分图匹配

时间:2018-08-06 16:27:22      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:size   long   col   end   exit   OLE   个学生   访问   var   

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.

 

二分图匹配

标签:size   long   col   end   exit   OLE   个学生   访问   var   

原文地址:https://www.cnblogs.com/brilliant107/p/9430803.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!