zoukankan      html  css  js  c++  java
  • HDU 2444 The Accomodation of Students 二分图匹配

    HDU 2444 The Accomodation of Students 二分图匹配

    题目来源:

    题意:

    给出学生数n和关系数m,接下来给出m个关系。
    要求将学生分成两部分,每一部分不能有互相认识的人。做不到就输出"No"
    若上一步满足,则将学生配对,要求这两个学生互相认识。

    题解:

    一个难点是建图,要求只是满足每一部分不能有认识的就好。
    建完图直接二分图最大匹配输出结果就好。

    代码:

    #include <bits/stdc++.h>
    typedef long long ll;
    typedef unsigned long long ull;
    using namespace std;
    int n,m;
    const int maxn=200+10;
    vector<pair<int,int> >mp;
    int G[maxn][maxn];
    int matched[maxn];
    int vi[maxn];
    int l[maxn],r[maxn];
    
    int dfs(int x)
    {
        for(int i=0;i<maxn;i++)
        {
            if(G[x][i] && !vi[i])
            {
                vi[i]=1;
                if(matched[i]==-1||dfs(matched[i]))
                {
                    matched[x]=i;
                    matched[i]=x;
                    return 1;
                }
            }
        }
        return 0;
    }
    
    int solve()
    {
        int ans=0;
        memset(matched,-1,sizeof(matched));
        for(int i=0;i<maxn;i++)
        {
            memset(vi,0,sizeof(vi));
            ans+=dfs(i);
        }
        return ans;
    }
    
    int main()
    {
    #ifndef ONLINE_JUDGE
        //freopen("3.in","r",stdin);
        //freopen("3.out","w",stdout);
    #endif
        int a,b;
        bool flag;
        while(cin >> n >> m)
        {
            flag=false;
            memset(l,0,sizeof(l));
            memset(r,0,sizeof(r));
            mp.clear();
            memset(G,0,sizeof(G));
            for(int i=0;i<m;i++)
            {
                cin >> a>> b;
                mp.push_back(make_pair(a,b));
            }
            for(int i=0;i<m;i++)
            {
                if((l[mp[i].first] && l[mp[i].second])||(r[mp[i].first]&& r[mp[i].second]))
                {
                    flag=1;
                    break;
                }
                l[mp[i].first]=1;
                r[mp[i].second]=1;
                G[mp[i].first][mp[i].second]=1;
            }
            if(flag)
                cout <<"No"<<endl;
            else
            {
                cout <<solve()<<endl;
            }
        }
        return 0;
    }
    
    
  • 相关阅读:
    ***php 数组添加关联元素的方法小结(关联数组添加元素)
    阿里云PHP Redis代码示例
    linux内核编程笔记【原创】
    linux RTC 驱动模型分析【转】
    linux 实时时钟(RTC)驱动【转】
    RTC系统【转】
    IRQ和FIQ中断的区别【转】
    NAND Flash【转】
    NandFlash详述【转】
    展讯NAND Flash高级教程【转】
  • 原文地址:https://www.cnblogs.com/Combustible-ice/p/5894042.html
Copyright © 2011-2022 走看看