UVALive 6322 最大匹配...
2015-08-03 10:47
357 查看
/*
*e...大概明白了。首先用最大匹配看看是不是存在符合题意的匹配。然后呢。对枚举找到每个位置符合的字母里最小的那个。
*判断是否能构成最大匹配。直到找完最后一个位置输出就好了。、
*还是有些不理解最大匹配匈牙利算法的过程。而且这个题是最大匹配。也没想到。
*/
LOoK
*e...大概明白了。首先用最大匹配看看是不是存在符合题意的匹配。然后呢。对枚举找到每个位置符合的字母里最小的那个。
*判断是否能构成最大匹配。直到找完最后一个位置输出就好了。、
*还是有些不理解最大匹配匈牙利算法的过程。而且这个题是最大匹配。也没想到。
*/
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> using namespace std; #define N 110 int g ; // 图的存储方式。矩阵。 int n; //二分图两个顶点集 本题个数相等 int vis ; //判断V2中的点是否已经被搜索过。一次寻找最大匹配中. int viss ; // 判断V2中的点是不是已经被匹配到其它位置。所有的最大匹配过程都包括。 int link ; // 记录V2中的点和谁匹配了。 int m; // 最大匹配数; int len; // 还未匹配的长度 char str , s ; int ans ; //保存每个位置匹配的字符对应的位置。 void init() { memset(vis, 0, sizeof(vis)); memset(viss, 0, sizeof(viss)); memset(link, 0, sizeof(link)); memset(g, 0, sizeof(g)); memset(ans, 0, sizeof(ans)); m = 0; } void build() { cin >> str+1; n = strlen(str+1); sort(str+1, str+1+n); for (int i=1; i<=n; ++i) { cin >> s; int len2 = strlen(s); for (int j=1; j<=n; ++j) { for (int k=0; k<len2; ++k) { if (str[j] == s[k]) g[i][j] = 1; // 建图。我没想到这样建。 } } } } int dfs(int x) { for (int y=1; y<=n; ++y) { if (g[x][y] && !vis[y] && !viss[y]) // 如果x和y有边。而且y未被搜索和匹配. { vis[y] = 1; // 标记已被搜索过. if (link[y] == 0 || dfs(link[y])) //如果y未被匹配。或者y匹配的节点可以找到增广路。(为什么这也算是匹配成功呢。那和这个节点匹配的怎么办) { link[y] = x; //当前匹配成功。 return 1; } } } return 0; } void max_m() { for (int x=1; x<=n; ++x) { memset(vis, 0, sizeof(vis)); // 清空上次搜索时的标记。 if (dfs(x)) m++; } return ; } int match() { int anss = 0; memset(link, 0, sizeof(link)); for (int x=1; x<=n; ++x) { if (ans[x]) continue; memset(vis, 0, sizeof(vis)); if (dfs(x)) anss++; } return anss == len; } int main() { int t; cin >> t; while(t--) { init(); build(); max_m(); if (m < n) { cout << "NO SOLUTION\n"; continue; } len = n; for (int i=1; i<=n; ++i) // 遍历每个位置的最小字符 用最大匹配判断是否可行。 { for (int j=1; j<=n; ++j) { if (!viss[j] && g[i][j]) // 没有被其它位置匹配。而且和当前位置有边。 { ans[i] = j; len--; viss[j] = 1; if (match()) break; // 当前位置成功。继续匹配下一个位置。 viss[j] = 0; //如果不成功。回溯。 len++; } } } for (int x=1; x<=n; ++x) { cout << str[ans[x]]; } cout << endl; } return 0; }
LOoK
相关文章推荐
- java程序设计线程池(newCachedThreadPool())
- 解决 jquery dialog 弹框destroy销毁方法不能把弹出元素设置成初始状态
- 解决cxf+spring发布的webservice,types,portType和message以import方式导入
- spss 数据库配置(mysql)
- 南邮 OJ 1028 Digital Roots
- linux下磁盘管理命令汇总
- 一些设计上的基本常识
- TeXstudio中如何编译eps格式的图片
- hdu 1166 敌兵布阵(线段树入门-单点更新)
- 信号量解决进程的同步和互斥
- openstack keypair实践
- Apache 多网站配置
- 排序
- 央行网络支付新规强调两个安全
- 最小费用最大流;HDU1533
- Android Adb.exe工具使用
- oracle 时间类型date 按天模糊查询
- jvm学习笔记
- POJ 2531 Network Saboteur(搜索)
- ROUND 2の Asia - Phuket2013