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 阅读(110) 评论(0) 收藏 举报
浙公网安备 33010602011771号