博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVALive 6322 最大匹配...
阅读量:5015 次
发布时间:2019-06-12

本文共 1808 字,大约阅读时间需要 6 分钟。

/*

 *e...大概明白了。首先用最大匹配看看是不是存在符合题意的匹配。然后呢。对枚举找到每个位置符合的字母里最小的那个。
 *判断是否能构成最大匹配。直到找完最后一个位置输出就好了。、

 *还是有些不理解最大匹配匈牙利算法的过程。而且这个题是最大匹配。也没想到。

 */

#include
#include
#include
#include
using namespace std;#define N 110int g[N][N]; // 图的存储方式。矩阵。int n; //二分图两个顶点集 本题个数相等int vis[N]; //判断V2中的点是否已经被搜索过。一次寻找最大匹配中.int viss[N]; // 判断V2中的点是不是已经被匹配到其它位置。所有的最大匹配过程都包括。int link[N]; // 记录V2中的点和谁匹配了。int m; // 最大匹配数;int len; // 还未匹配的长度char str[N], s[N];int ans[N]; //保存每个位置匹配的字符对应的位置。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
> 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

 

转载于:https://www.cnblogs.com/icode-girl/p/4698729.html

你可能感兴趣的文章
WCF:如何将net.tcp协议寄宿到IIS
查看>>
WebAPI HelpPage支持area
查看>>
Path元素
查看>>
php_soap扩展应用
查看>>
第二百三十一节,Bootstrap 介绍
查看>>
vi/vim 三种模式的操作
查看>>
JAVA面向对象三大特性总结
查看>>
guid
查看>>
Python中出现“TabError: inconsistent use of tabs and spaces in indentation”问题的解决
查看>>
ajax请求
查看>>
js学习总结----DOM增删改和应用
查看>>
希尔伯特矩阵(Hilbert matrix)
查看>>
(20)sopel算法
查看>>
学习总结 javascript 闭包
查看>>
实验吧一个小坑注入
查看>>
【 D3.js 高级系列 — 8.0 】 打标
查看>>
Mac必备软件推荐
查看>>
Android Gson深入分析
查看>>
display:flow-root
查看>>
判读字符串是否为空的全局宏-分享
查看>>