poj 2239 Selecting Courses 最大匹配

题目大意:在大学里有许许多多的课程,现在小明需要去选择课程,他是一个爱学习的人,所以想尽可能多的选择课程,
在学校里有n个课程,并且在学校规定,每周里的每天有12节课,那么一周就有7*12节课。
输入第一行为n,代表有n个课程
接下来n行,每行第一个数字x代表这个课程在这一周里面需要上x次。
然后跟着x对数字,第一个D代表这周的哪一天,第二个C代表这天的哪一节课
如果几个课程都在那d天的那c节课上课,那么你需要选择其中的一个,而不能选择多个课程

现在要求算出小明最多可以选择多少个课程

分析:将课程和时间看成一个二分图,然后进行最大匹配就好了。

下面附程序:

var
  n,i,j,s,x,y,ans:longint;
  link:array[1..400] of longint;
  v:array[1..400] of boolean;
  a:array[1..400,1..400] of boolean;

function find(x:longint):boolean;
var
  p,i:longint;
begin
  find:=false;
  for i:=1 to 84 do
    if (v[i])and(a[x,i]) then
    begin
      v[i]:=false;
      p:=link[i];
      link[i]:=x;
      if (p=0)or(find(p)) then exit(true);
      link[i]:=p;
    end;
end;

begin
  while not eof do
  begin
    readln(n);
    fillchar(a,sizeof(a),false);
    for i:=1 to n do
    begin
      read(s);
      for j:=1 to s do
      begin
        read(x,y);
        a[i,(x-1)*12+y]:=true;
      end;
      readln;
    end;
    fillchar(link,sizeof(link),0);
    ans:=0;
    for i:=1 to n do
    begin
      fillchar(v,sizeof(v),true);
      if find(i) then inc(ans);
    end;
    writeln(ans);
  end;
end.


你可能感兴趣的:(poj 2239 Selecting Courses 最大匹配)