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) 编辑 收藏 举报