POJ 1422 Air Raid 及 关于匈牙利算法的理解的小比喻
2015-03-22 21:20
190 查看
这是一题水水的题, 这题用了匈牙利算法,求二分图的最大匹配数, 然后用点数去减, 便是答案。
我自己在理解匈牙利算法的时候想了一个小比喻,便是: A 发现了一个符合他的座位, 但是发现B坐在上面, 于是便对B说, “B 啊, 你还有没有其他的座位可以坐啊, 有的话你去坐那个座位吧。” 然后B往后找其他座位, 找到了一个符合的座位, 发现C坐在上面, 于是便对C说:“ C 啊,你还有没有其他的座位可以坐啊, 有的话你去坐那个座位吧。”然后C也往后找其他的符合条件的座位。。。。。。 最后到了F,F 找到了一个符合的座位, 便打电话给E, E便坐在F原先的位置上, 又打电话给D。。。 。。。最后大家都找到了座位 。怎么样? 形象不形象~~ 哈哈 , 我觉得还可以~~
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #define mem(a) memset(a, 0, sizeof(a)) using namespace std; bool vis[125], map[125][125]; int lk[125], n; bool dfs(int a) { int i; for(i = 1;i <= n;i++) { if(!vis[i]&&map[a][i]) { vis[i] = 1; if(lk[i] == -1||dfs(lk[i])) { lk[i] = a; return true; } } } return false; } int main(int argc, char *argv[]) { int i, j, k, t, m, res; scanf("%d",&t); while(t--) { res = 0; mem(vis); mem(map); memset(lk, -1, sizeof(lk)); scanf("%d%d",&n, &m); for(i = 0;i < m;i++) { scanf("%d%d",&j, &k); map[j][k] = 1; } for(i = 1;i <= n;i++) { mem(vis); if(dfs(i)) res++; } printf("%d\n", n - res); } return 0; }
相关文章推荐
- 匈牙利算法 (poj1422-Air Raid,poj1469-COURSES)
- POJ 1422 Air Raid(匈牙利算法—最小路径覆盖)
- POJ 1422 Air Raid (二分图最小点集覆盖 匈牙利算法)
- POJ-1422-Air Raid-求最小路径覆盖(匈牙利算法)
- 匈牙利扩展 - Air Raid POJ - 1422
- poj&nbsp;1422&nbsp;Air&nbsp;Raid(匈牙利&nbsp;DAC图最…
- POJ 1422 Air Raid (最小路径覆盖)
- POJ 1422 Air Raid (最小路径覆盖)
- poj 1422 Air Raid (最小路径覆盖 )
- POJ 1422/ HDU 1151 Air Raid
- POJ-1422 Air Raid 最小路径覆盖
- poj 1422Air Raid
- POJ-1422-Air Raid(二分图最小路径覆盖)
- POJ 1422 Air Raid 最小路径覆盖 构图!
- poj 1422 Air Raid (二分图匹配)
- POJ-1422-Air Raid
- POJ 1422 Air Raid
- poj 1422Air Raid--最小路径覆盖
- poj1422 Air Raid 二分匹配之最小路径覆盖
- poj 1422 Air Raid (二分匹配)