HDU 2819 swap(二分图匹配并记录路径)
2015-03-30 11:36
302 查看
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #define LL long long using namespace std; const int MAXN = 100 + 10; int G[MAXN][MAXN]; int vis[MAXN]; int match[MAXN]; int N; int path(int u) { for(int v=1;v<=N;v++) { if(G[u][v] && !vis[v]) { vis[v] = 1; if(match[v] == -1 || path(match[v])) { match[v] = u; return 1; } } } return 0; } int MaxMatch() { int res = 0; memset(match, -1, sizeof(match)); for(int u=1;u<=N;u++) { memset(vis, 0, sizeof(vis)); res += path(u); } return res; } int a[MAXN], b[MAXN]; int main() { while(scanf("%d", &N)!=EOF) { memset(G, 0, sizeof(G)); for(int i=1;i<=N;i++) { for(int j=1;j<=N;j++) scanf("%d", &G[i][j]); } int ans = MaxMatch(); if(ans < N) { printf("-1\n"); continue; } int acc = 0; for(int i=1;i<=N;i++) { int j; for(j=1;j<=N;j++) if(match[j] == i) break; if(j != i) { a[++acc] = i; b[acc] = j; swap(match[i], match[j]); } } printf("%d\n", acc); for(int i=1;i<=acc;i++) { printf("C %d %d\n", a[i], b[i]); } } return 0; }
相关文章推荐
- HDU2819 Swap(二分图匹配匈牙利算法+记录路径)
- hdu 2819 Swap(二分匹配+记录路径,好题)
- Swap - HDU 2819 二分图匹配
- hdu 2819 记录路径的二分匹配
- HDU 2819 Swap(二分图匹配)
- hdu2819-Swap(二分图匹配,思路)
- hdu 2819 Swap(二分图匹配)
- hdu 2819 Swap 二分图匹配 匈牙利算法 解题报告
- HDU - 2819 Swap (二分图匹配)
- HDU 2819 Swap (最大二分匹配+输出路径)
- HDU - 2819 Swap (二分匹配+输出路径)
- HDU-2819 Swap 二分图匹配
- HDU2819(二分图匹配,记录过程)
- hdu2819 swap(二分图匹配)
- HDU-2819-Swap [二分匹配][输出路径]
- hdu-2819 Swap 二分图匹配
- ACM HDU 2819 Swap (二分图匹配,记录过程)
- HDU 2819 Swap(记录二分匹配的过程)
- hdu 2819 Swap(二分图匹配)
- hdu 2819 Swap [二分图匹配]