zoukankan      html  css  js  c++  java
  • luogu P2071 座位安排

    这个题可以被分为两部分

    1.匈牙利算法(板子)

    2.邻接表存图(好像这不能称为第二部分)

    每一排能坐两个人,那就把一排拆成两个点,

    用匈牙利算法求最大匹配

    每个人都只想坐两排,说明每个人只会连四条边

    如果不会匈牙利的请点这里

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 5100;
    int link[N]={0},cnt[N]={0},w[N][N];
    bool used[N];
    int ans=0,n;
    int x,y;
    bool find(int x)
    {
        for(int i=1;i<=cnt[x];i++)
        {
            if(!used[w[x][i]])
            {
                used[w[x][i]]=true;
                if(!link[w[x][i]] || find(link[w[x][i]]))
                {
                    link[w[x][i]]=x;
                    return true;
                }
            }
        }
        return false;
    }
    void xyl()
    {
        for(int i=1;i<=n*2;i++)
        {
            memset(used,0,sizeof(used));
            if(find(i))
                ans++;
        }
    }
    int main()
    {
        cin>>n;
        for(int i=1;i<=n*2;i++)
        {
            cin>>x>>y;
            w[i][++cnt[i]]=x;
            w[i][++cnt[i]]=x+n;
            w[i][++cnt[i]]=y;
            w[i][++cnt[i]]=y+n;
        }
        xyl();
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    Qt ini文件
    Qt我的文档 桌面路径
    windows zlib库编译步骤
    环形缓冲区
    openssl生成随机数
    怎样安装Scrapy
    CentOS7怎样安装GoAccess1.3
    Docker创建数据卷容器
    Docker创建数据卷
    Docker创建容器
  • 原文地址:https://www.cnblogs.com/xmex/p/10165775.html
Copyright © 2011-2022 走看看