hdu 2819【Swap】
2012-05-11 15:47
148 查看
不错的一道题目,但是中途我还是出问题了,代码中有注释
代码如下:
代码如下:
#include <cstdio> #include <cstring> struct node { int x,y; }ans[1005]; int g[200][200]; bool vis[200]; int link[200]; int match[200]; int n; void init() { memset(link, -1,sizeof(link)); } bool can(int x) { for(int i = 0;i < n;i ++) { if(g[i][x]&&!vis[i])//这里我用的是g[i][x],我要获得的是行的匹配的列的值 { vis[i] = true; if(link[i] == -1 || can(link[i])) { link[i] = x; return true; } } } return false; } int maxmatch() { int num = 0; for(int i = 0;i < n;i ++) { memset(vis,false,sizeof(vis)); if(can(i)) num++; } return num; } int main() { while(scanf("%d",&n) == 1) { init(); for(int i = 0;i < n;i ++) { for(int j = 0;j < n;j ++) { scanf("%d",&g[i][j]); } } if(maxmatch() != n) { printf("-1\n"); } else { int num = 0; for(int i = 0;i < n;i ++) { if(link[i] != -1) { match[link[i]] = i;//列匹配行 } } int k = 0; for(int i = 0;i < n;i ++) { if(link[i] != i) { ans[k].x = i + 1; ans[k ++].y = link[i] + 1; link[match[i]] = link[i]; match[link[i]] = match[i];//坑啊,我就是这里忘记改变列匹配的值了,结果一直WA,还是看了别人的代码才知道的,呜呜 } } printf("%d\n",k); for(int i = 0;i < k;i ++) { printf("C %d %d\n",ans[i].x,ans[i].y); } } } return 0; }
相关文章推荐
- hdu2819 Swap(二分匹配)
- hdu-2819 Swap 二分图匹配
- hdu 2819 Swap 二分图匹配
- HDU 2819 Swap (行列匹配+输出解)
- HDU 2819 Swap(记录二分匹配的过程)
- HDU 2819 Swap (二分图-行列匹配+输出解)
- HDU2819-Swap
- HDU 2819 Swap
- HDU - 2819 Swap (二分图匹配)
- HDU 2819 Swap 二分匹配
- HDU 2819 Swap (行列匹配+输出解)
- hdu 2819 Swap【完美二分匹配】
- hdu 2819 Swap(二分图匹配)
- hdu2819 Swap
- hdu 2819 Swap(二分图匹配)
- HDU-2819 Swap
- HDU 2819 — Swap 二分匹配
- hdu2819 Swap
- HDU - 2819 Swap (二分匹配+输出路径)
- HDU 2819 Swap 最大匹配问题