zoukankan      html  css  js  c++  java
  • bzoj 1433 二分图匹配

    裸地匈牙利或者最大流,直接匹配就行了

    需要注意的是(我就没注意细节WA了好多次。。。)

    每个人和自己之间的边是0,但是应该是1

    不是在校生是没有床的。。。。

    /**************************************************************
        Problem: 1433
        User: BLADEVIL
        Language: Pascal
        Result: Accepted
        Time:84 ms
        Memory:268 kb
    ****************************************************************/
     
    //By BLADEVIL
    var
        t, n, m                 :longint;
        i                       :longint;
        size                    :array[0..100] of longint; 
        know                    :array[0..100,0..100] of longint;
        flag, bed               :array[0..100] of boolean;
        link                    :array[0..100] of longint;
         
    function find(x:longint):boolean;
    var
        i                       :longint;
    begin
        for i:=1 to n do
            if know[x,i]=1 then
                if (not flag[i]) and (bed[i]) then
                begin
                    flag[i]:=true;
                    if (link[i]=0) or (find(link[i])) then
                    begin
                        link[i]:=x;
                        exit(true);
                    end;
                end;
        exit(false);
    end;
         
    procedure main;
    var
        i, j                    :longint;
        x                       :longint;
        ans, sum                :longint;
    begin
        read(n);
        fillchar(link,sizeof(link),0);
        fillchar(size,sizeof(size),0);
        fillchar(know,sizeof(know),0);
        fillchar(bed,sizeof(bed),false);
        for i:=1 to n do read(size[i]);
        for i:=1 to n do if size[i]=1 then bed[i]:=true;
        for i:=1 to n do
        begin
            read(x);
            if (size[i]=1) and (x=0) then size[i]:=0;
        end;
        for i:=1 to n do
            for j:=1 to n do read(know[i,j]);
        for i:=1 to n do know[i,i]:=1;
        ans:=0; sum:=0;
        for i:=1 to n do if size[i]=0 then inc(sum);
        for i:=1 to n do
            if size[i]=0 then
            begin
                fillchar(flag,sizeof(flag),false);
                if find(i) then inc(ans);
            end;
        if sum=ans then writeln('^_^') else writeln('T_T');
    end;
         
    begin
        read(t);
        for i:=1 to t do main;
    end.
  • 相关阅读:
    XStream和Dom4j的区别
    tomcat 性能优化(内存优化 线程优化)
    安装tomcat
    python 全栈开发,Day10(动态参数,命名空间,作用域,函数嵌套)
    python 全栈开发,Day9(函数的初始,返回值,传参,三元运算)
    python 全栈开发,Day8(文件操作)
    python 全栈开发,Day7(元组转换,列表以及字典的坑,集合,关系测试,深浅copy,编码补充)
    python 全栈开发,Day6(is,小数据池,编码转换)
    python 全栈开发,Day5(字典,增删改查,其他操作方法)
    python 全栈开发,Day4(列表切片,增删改查,常用操作方法,元组,range,join)
  • 原文地址:https://www.cnblogs.com/BLADEVIL/p/3470350.html
Copyright © 2011-2022 走看看