1. 程式人生 > >【HDU】2063 過山車 二分圖匹配

【HDU】2063 過山車 二分圖匹配

第一次學二分圖匹配

感覺對這個演算法的印象不是很深

以後要多加練習(這話說出來我自己都不信)

發現了一件事兒

vector的size函式返回值是unsigned

所以a[i].size()==0時

for (register int i=1;i<=a[i].size()-1;++i) 這個迴圈

就會出問題了

所以要用for (register int i=1;i<a[i].size();++i)

以前也遇到過這種問題

剛剛我和Sillyf還在糾結的時候

Axcosin大佬在一旁冷冷地來了一句

“size的返回值不是unsigned的嗎”


Run ID Submit Time Judge Status Pro.ID Exe.Time Exe.Memory Code Len. Language Author
22421253 2017-10-15 21:09:03 Accepted 2063 0MS 1580K 768 B G++
22421021 2017-10-15 20:55:56 Runtime Error
(ACCESS_VIOLATION)
2063 0MS 1636K 784 B G++
22420947 2017-10-15 20:51:00 Wrong Answer 2063 0MS 1560K 714 B G++
22420885 2017-10-15 20:46:14 Runtime Error
(ACCESS_VIOLATION)
2063 0MS 1640K 791 B G++
22420831 2017-10-15 20:43:39 Wrong Answer 2063 0MS 1560K 665 B G++
22419593 2017-10-15 19:24:53 Wrong Answer 2063 0MS 1644K 929 B G++

Problem : 2063 ( 過山車 )     Judge Status : Accepted
RunId : 22421253    Language : G++    Author : FMM666
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;

bool bo[505];
vector<int>a[505];
int l[505];
int m,b,g,ans,q,w;

bool pd(int x)
{
    for (register int j=0;j<a[x].size();++j)
    {
        if (!bo[a[x][j]])
        {
            bo[a[x][j]]=1;
            if (l[a[x][j]]==0||pd(l[a[x][j]]))
            {
                l[a[x][j]]=x;
                return 1;
            }
        }
    }
    return 0;
}

int main(void)
{
    while(scanf("%d",&m)!=EOF && m)
    {
        scanf("%d%d",&g,&b);
        for(register int i=1;i<=g;++i) a[i].clear();
        for (register int i=1;i<=m;++i)
        {
            scanf("%d%d",&q,&w);
            a[q].push_back(w);
        }
        memset(l,0,sizeof(l));
        ans=0;
        for (register int i=1;i<=g;++i)
        {
            memset(bo,0,sizeof(bo));
            if (pd(i)) ++ans;
        }
        printf("%d\n",ans);
    }
    return 0;
}