Kuangbin 匹配专题

HDU 2819

因为矩阵的对角线全为1,所以是一个满秩矩阵 R(A) = N,初等变换不改变矩阵的秩,

所以如果交换矩阵的行或矩阵的列不能得到完全匹配的话,交换行和列也无法得到

/*
 * @Author: CY__HHH
 * @Date: 2019-10-27 17:36:57
 * @LastEditTime: 2019-10-27 22:22:23
 */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
const int maxn = 105;
using namespace std;
bool Grape[maxn][maxn];
bool vis[maxn];
int p[maxn],n;
bool find(int u)
{
    for(int v=1;v<=n;++v)
    {
        if(Grape[u][v]&&!vis[v])
        {
            vis[v] = true;
            if(p[v]==-1||find(p[v]))
            {
                p[v] = u;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    while(cin>>n)
    {
        memset(p,-1,sizeof(p));
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j)
                cin>>Grape[i][j];
        int cnt = 0;
        for(int u=1;u<=n;++u)
        {
            memset(vis,false,sizeof(vis));
            if(find(u))
                ++cnt;
        }
        if(cnt != n)
        {
            cout<<-1<<'\n';
            continue;
        }
        vector<pair<int,int>> arr;
        for(int i=1;i<=n;++i)
        {
            if(p[i]!=i)
            {
                for(int j=i+1;j<=n;++j)
                    if(p[j] == i)
                    {
                        arr.push_back(make_pair(p[j],p[i]));
                        swap(p[j],p[i]);
                    }
            }
        }
        cout<<arr.size()<<'\n';
        for(int i=0;i!=arr.size();++i)
            cout<<"R"<<" "<<arr[i].first<<" "<<arr[i].second<<'\n';
    }
}

  

posted on 2019-10-27 23:04  chengyulala  阅读(105)  评论(0编辑  收藏  举报

导航