SRM 658 div1 850 DancingForever [二分图匹配]
2018-03-08 22:04
369 查看
Description:
nn个男孩和nn个女孩,每个男孩喜欢至少一个女孩。你需要给出一种配对方案,满足至少有一对,且每个配对的男孩和他喜欢的女孩配对且他喜欢的其他女孩都被配了对,输出任意一组解。
Solution:
如果直接跑匈牙利,那么不能符合。于是
nn个男孩和nn个女孩,每个男孩喜欢至少一个女孩。你需要给出一种配对方案,满足至少有一对,且每个配对的男孩和他喜欢的女孩配对且他喜欢的其他女孩都被配了对,输出任意一组解。
Solution:
如果直接跑匈牙利,那么不能符合。于是
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <string> #include <cmath> using namespace std; const int N = 205; int match , vis ; vector<int> G ; bool dfs(int u) { if(vis[u]) { return false; } vis[u] = 1; for(int i = 0; i < G[u].size(); ++i) { int v = G[u][i]; if(match[v] == -1 || dfs(match[v])) { match[v] = u; match[u] = v; return true; } } return false; } class DancingForever { public: vector <int> getStablePairs(string s) { int n = round(sqrt(s.size())); for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { if(s[i * n + j] == 'Y') { G[i].push_back(j + n); G[j + n].push_back(i); } } } vector<int> ret; memset(match, -1, sizeof(match)); for(int f = 1; f;) { f = 0; memset(vis, 0, sizeof(vis)); for(int i = 0; i < n; ++i) { if(match[i] == -1 && dfs(i)) { f = 1; } } } int S = -1; for(int i = 0; i < n; ++i) { if(match[i] == -1) { S = i; } } if(S == -1) { for(int i = 0; i < n; ++i) { ret.push_back(i); ret.push_back(match[i] - n); } } else { memset(vis, 0, sizeof(vis)); dfs(S); for(int i = 0; i < n; ++i) { if(match[i] != -1 && vis[i]) { ret.push_back(i); ret.push_back(match[i] - n); } } } return ret; } };
相关文章推荐
- TopCoder SRM 658 Div1 300 - OddEvenTree (树的性质 + 构造)
- SRM 658 DIV1 650 二分答案 动态规划
- [数学 二分图匹配] SRM 456 div1 FunctionalEquation
- topcoder SRM 610 DIV2 DivideByZero
- tc-SRM-626-DIV1-250
- SRM 678(div2)
- topcoder srm 435 div1
- SRM 500 DIV1 B
- 【TC SRM 718 DIV 2 B】Reconstruct Graph
- 【SRM 717 div2 B】LexmaxReplace
- TC SRM 593 DIV1 250(dfs)
- topcoder srm 440 div1
- [最小割] SRM 590 div1 FoxAndCity
- topcoder SRM 593 DIV2 WolfDelaymaster
- SRM 405 DIV2
- topcoder srm 585 div1
- Topcoder SRM 517 DIV2 1000 CuttingGrass
- Topcoder SRM 597 DIV 1
- SRM 528 DIV 2
- Topcoder SRM 598 DIV 1