poj 3041

来源:互联网 发布:windows 优盘启动 编辑:程序博客网 时间:2024/06/02 04:29
#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>#include <vector>using namespace std;#define maxn 1000 + 10vector<int>G[maxn];bool vis[maxn];int link[maxn];int n, m;bool Find(int u){    for(int i=0; i<G[u].size(); i++)    {        int &v = G[u][i];        if(!vis[v])        {            vis[v] = true;            if(link[v]==-1 || Find(link[v]))            {                link[v] = u;                link[u] = v;                return true;            }        }    }    return false;}void solve(){    int ans = 0;    for(int i=1; i<=n; i++)    if(link[i]==-1)///这里需要加上判断 否则对已经匹配好的进行重新匹配,造成错误结果。    {        memset(vis, 0, sizeof(vis));        if(Find(i))  ans++;    }    printf("%d\n", ans);}int main(){    while(~scanf("%d%d", &n, &m))    {        for(int i=1; i<=n; i++)            G[i].clear();        memset(link, -1, sizeof(link));        for(int i=0; i<m; i++)        {            int r, c;            scanf("%d%d", &r, &c);            G[r].push_back(c + n);            G[c+n].push_back(r);        }        solve();    }    return 0;}

0 0
原创粉丝点击