HDU 2819 二分匹配
2014-08-12 23:15
489 查看
// // main.cpp // HDU 2819 二分匹配 // // Created by 郑喆君 on 8/12/14. // Copyright (c) 2014 itcast. All rights reserved. // #include<cstdio> #include<cstring> #include<iostream> #include<iomanip> #include<queue> #include<cmath> #include<stack> #include<map> #include<vector> #include<set> #include<algorithm> using namespace std; typedef long long LL; const int int_max = 0x07777777; const int int_min = 0x80000000; const int maxn = 110; int n,mymap[maxn][maxn],vis[maxn],lx[maxn]; int ret; bool find (int x){ for(int i = 0; i < n; i++){ if(!vis[i] && mymap[x][i]){ vis[i] = 1; if(lx[i]==-1 || find(lx[i])){ lx[i] = x; return true; } } } return false; } void solve (){ ret = 0; memset(lx, -1, sizeof(lx)); for(int i = 0; i < n; i++){ memset(vis, 0, sizeof(vis)); if(find(i)) ret++; } } int main(int argc, const char * argv[]) { while (scanf("%d", &n)!=EOF) { memset(mymap, 0, sizeof(mymap)); for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ int u; scanf("%d", &u); if(u) mymap[i][j] = 1; } } solve(); if(ret==n){ vector<int> ret1,ret2; int pos[maxn]; for(int i = 0; i < n; i++) pos[i] = i; for(int i = 0; i < n; i++){ if(pos[i]==lx[i]) continue; int j; for(j = i+1; j < n; j++){ if(lx[i]==pos[j]) break; } ret1.push_back(i); ret2.push_back(j); pos[j] = pos[i]; } printf("%d\n", (int)ret1.size()); for(int i = 0; i < ret1.size(); i++){ printf("R %d %d\n", ret1[i]+1, ret2[i]+1); } }else{ cout << -1 << endl; } } }
相关文章推荐
- HDU 2819 矩阵交换列使得主对角线都为1 二分匹配
- hdu 2819 记录路径的二分匹配
- HDU 2819 (二分匹配)
- HDU 2819 Swap (二分匹配+破输出)
- HDU 2819 Swap 二分匹配
- hdu-2819 Swap (二分匹配)
- hdu 2819 Swap(二分匹配+记录路径,好题)
- HDU 2819 Swap(记录二分匹配的过程)
- hdu 2819(二分匹配)
- hdu2819 Swap(二分匹配)
- HDU 2819 矩阵 最大二分匹配
- hdu 2819 Swap【完美二分匹配】
- HDU-2819-Swap [二分匹配][输出路径]
- HDU 2819 — Swap 二分匹配
- HDU 2819 — Swap 二分匹配
- hdu 2819(二分匹配)
- hdu 2819 二分匹配
- HDU - 2819 Swap (二分匹配+输出路径)
- HDU 2819 Swap (最大二分匹配+输出路径)
- HDU2819【二分匹配与矩阵的秩】