对于二分图的认识
2020-08-21 15:35
169 查看
不正确的:(为的是找错误)
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <string> #include <algorithm> #include <math.h> #define Fast_io ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); #define filein freopen("input.txt", "r", stdin); #define fileout freopen("output.txt", "w", stdout); using namespace std; typedef long long ll; const int N = 1e7 + 10; int n, m, match[210]; bool book[210], flag, e[210][210]; int c[210]; void dye(int u, int col) { int i; for (i = 1; i <= n; i++) { if (e[u][i] == 1) { if (c[i] == 0) { c[i] = -col; dye(i, -col); } else if (c[i] == c[u]) { flag = 0; return; } } } } int dfs(int u) { int i; for (i = 1; i <= n; i++) { if (book[i] == 0 && e[u][i] && match[u] != i) { book[i] = 1; if (match[i] == 0 || dfs(match[i])) { match[i] = u;//错误二处 match[u] = i;// return 1; } } } return 0; } int main() { Fast_io; while (cin >> n >> m) { memset(e, 0, sizeof(e)); memset(match, 0, sizeof(match)); int i; while (m--) { int u, v; cin >> u >> v; **e[u][v] = e[v][u] = 1;**//错误一处 } flag = 1; memset(c, 0, sizeof(c)); for (i = 1; i <= n; i++) { if (c[i] == 0) { c[i] = 1; dye(i, 1); //1表示黑的, -1表示白的 if (flag == 0) break; } } if (flag == 0) printf("No\n"); else { int sum = 0; for (i = 1; i <= n; i++) { memset(book, 0, sizeof(book)); if (dfs(i)) sum++; } printf("%d\n", sum); } } return 0; }
这个代码是错误的
一处的储存两边之间的关系的时候用的是无向边储存的,二处的是匹配的值和原来的值都匹配,这样就导致了有的边多匹配了,而且在匹配的基础上多加了一个匹配。
方法:(1)把无向储存变成有向,当然,在匹配的过程中两个匹配值都是匹配的对方。
方法:(2)把匹配两个值得互相匹配改成值匹配了一个值(意思是只储存上家的值,上家并不匹配自己)。
相关文章推荐
- 对于Linux平台下C语言开发中__sync_函数的认识
- 对于python的认识
- 对于Hibernate框架的认识
- 对于数据库的认识
- js中对于类的基本认识
- 对于poi的一点认识
- 对于HOOK函数的一点认识
- 对于大型公司项目平台选择j2ee的几层认识(四)
- 【三层架构】对于三层架构的认识和总结
- 对于软件工程的认识与疑问
- Objective-C 【对于@property功能的新认识(setter、getter)】
- 对于未来是全栈工程师的世界这一说法的认识
- 对于HOOK函数的一点认识
- 对于rocketio和rapidio有模糊认识的可以参考以下文章
- 谈谈对于vmware Workstation 网络连接三种模式的认识.
- 对于文件权限的管理简单认识
- 对于git的认识
- 今天对于自定义事件与方法的区别有了一点感性的认识
- Android中关于JNI 的学习(一)对于JNIEnv的一些认识
- 对于变量的一些认识