bzoj 1191 匈牙利算法

这道题是一个裸的二分图。

 

/**************************************************************
    Problem: 1191
    User: Davidliu
    Language: Pascal
    Result: Accepted
    Time:8 ms
    Memory:256 kb
****************************************************************/
 
//program bzoj 1191 匈牙利算法;
var n,m                         :longint;
    last,other,pre              :array[0..2022] of longint;
    link                        :array[0..1012] of longint;
    flag                        :array[0..1012] of boolean;
    l,i,j                       :longint;
    a,b                                             :longint;
        ans                                             :longint;
 
procedure   connect(x,y         :longint);
begin
    inc(l);
    pre[l]:=last[x];
    last[x]:=l;
    other[l]:=y;
end;
 
procedure   init;
var i                                                   :longint;
begin
    read(n,m);
    l:=0;
    for i:=1 to m do
    begin
        read(a,b);
        connect(i,a);
        connect(i,b);
    end;
end;
 
function    find(x              :longint):boolean;
var
    i,p,q                       :longint;
begin
    q:=last[x];
    while q<>0 do
    begin
        p:=other[q];
        if not flag[p] then
        begin
            flag[p]:=true;;
            if (link[p]=0) or (find(link[p])) then
            begin
                link[p]:=x;
                exit(true);
            end;
        end;
        q:=pre[q];
    end;
    exit(false);
end;
 
procedure   main;
var i                           :longint;
begin
    ans:=0;
    for i:=1 to m do
    begin
        fillchar(flag,sizeof(flag),false);
        if find(i) then inc(ans) else break;
    end;
    writeln(ans);
end;
 
begin
    init;
    main;
end.
posted @ 2014-04-15 17:39  Davidlxy  阅读(143)  评论(1编辑  收藏  举报