POJ1274 二分匹配
2015-10-29 22:06
225 查看
题意:
有n个奶牛m个谷仓,农场主John发现有的奶牛只喜欢在它喜欢的谷仓产奶,根据一周发现得出的数据,你需要计算最大匹配的数目
具体匈牙利算法还是要去看这个帅哥的。/article/1613615.html,写的非常非常赞,反倒是书上说的太复杂而想复杂看不懂了。具体过程去这个博主看吧。
本题正是采用匈牙利算法加链式前向星随意水过。
下面贴代码:
有n个奶牛m个谷仓,农场主John发现有的奶牛只喜欢在它喜欢的谷仓产奶,根据一周发现得出的数据,你需要计算最大匹配的数目
具体匈牙利算法还是要去看这个帅哥的。/article/1613615.html,写的非常非常赞,反倒是书上说的太复杂而想复杂看不懂了。具体过程去这个博主看吧。
本题正是采用匈牙利算法加链式前向星随意水过。
下面贴代码:
#define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<queue> #include<cmath> #include<fstream> using namespace std; //FILE *buf = freopen("t.txt", "a+", stdin); const int MAX = 5000;//这里要注意开大点,200个点,最稠密都有4万条边 struct Edge { int next, to, v; }edge[MAX << 1]; int head[MAX]; int k; int cx[MAX], cy[MAX]; int bmark[MAX]; int N, M; void addedge(int u,int v) { edge[k].to = v; edge[k].next = head[u]; head[u] = k; k++; } void init() { k = 0; for (int i = 0; i < MAX; i++) { cx[i] = cy[i] = -1; head[i] = -1; } head[0] = edge[0].next = -1; } bool findxy(int u) { for (int i = head[u]; i != -1; i = edge[i].next) { int to = edge[i].to; if (!bmark[to]) { bmark[to] = true; if (cy[to] == -1 || findxy(cy[to])) { cy[to] = u; cx[u] = to; return 1; } } } return 0; } int Max_Match() { int MaxNum = 0; for (int i = 1; i <= N; i++) { memset(bmark, false, sizeof(bmark)); if (findxy(i)) { MaxNum++; } } return MaxNum; } int main() { while (cin >> N >> M) { init(); for (int i = 1; i <= N; i++) { int a; cin >> a; while (a--) { int b; cin >> b; addedge(i, b); } } cout << Max_Match() << endl; } return 0; }
相关文章推荐
- FPGA之流水灯
- PuTTY使用
- cmd取UTF-8编码的数据显示乱码
- 52. PHP 伪静态
- iOS开发网络篇—HTTP协议
- CAlayer的使用
- 我所认识的BIM&Revit
- TOj 3070. Encryption【水题】
- 驱动开发学习资料
- POJ 2752 Seek the Name, Seek the Fame
- Swing创建带图标的右键弹出菜单
- 深入理解C语言的函数调用过程
- 排序算法 之 快速排序
- 在jQuery与Node之间创建跨域请求(Cross-Origin Resource Sharing (CORS) )
- poj 2349 Arctic Network 最小生成树第k大边-kruskal
- Java中常用字符串方法总结
- 1058. A+B in Hogwarts
- CUDA之内存
- hdoj1042(N!,大数乘)
- myeclipse的jre与安装的jre不同之处