POJ3041(二分图匹配)
来源:互联网 发布:java utf 8编码 编辑:程序博客网 时间:2024/05/24 04:30
题意:在N*N的网格中有K个小行星,已知行星位置,然后依次消除一行或者一列的小行星,消除所有小行星需要多少次?
题解:根据每一个行星的位置,(x,y),就将x,y+n之间建边,建边之后对应图为:
这里的边代表是行星,这里左边的点是代表一行,右边的点代表一列,选择了u1则代表u1-v1和u1-v3的点全部被消除掉,那么问题就转换成了最小顶点覆盖。
最小顶点覆盖是NP问题,不过这是在二分图中,所以最小顶点覆盖在数值上代表二分图最大匹配。
就可以做了。
#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int MAXN = 5010;//点数的最大值const int MAXM = 50010;//边数的最大值struct Edge{ int to,next;} edge[MAXM];int head[MAXN],tot;void init(){ tot = 0; memset(head,-1,sizeof(head));}void addedge(int u,int v){ edge[tot].to = v; edge[tot].next = head[u]; head[u] = tot++;}int linker[MAXN];bool used[MAXN];int uN;bool dfs(int u){ for(int i = head[u]; i != -1 ; i = edge[i].next) { int v = edge[i].to; if(!used[v]) { used[v] = true; if(linker[v] == -1 || dfs(linker[v])) { linker[v] = u; return true; } } } return false;}int hungary(){ int res = 0; memset(linker,-1,sizeof(linker)); for(int u = 0; u < uN; u++) //点的编号0~uN-1 { memset(used,false,sizeof(used)); if(dfs(u))res++; } return res;}int main(){ int n,k,a,b; while(~scanf("%d %d",&n,&k)) { init(); for (int i = 0 ; i < k; i++) { scanf("%d %d",&a,&b); addedge(a,b + n); } uN = 2 * n; int sum = hungary(); printf("%d\n",sum); }}
阅读全文
0 0
- POJ3041(二分图匹配)
- POJ3041-Asteroids(二分图匹配)
- POJ3041:Asteroids(二分图匹配)
- 二分图匹配应用。。poj3041
- poj3041-二分图最大匹配
- poj3041--二分图匹配算法
- POJ3041 二分图最大匹配
- poj3041--Asteroids(二分匹配)
- poj3041 二分图最大匹配(匈牙利算法)
- POJ3041 二分图最大匹配(网络流算法)
- POJ3041——Asteroids(二分图最大匹配)
- 二分图最大匹配:匈牙利算法(poj3041)
- POJ3041--Asteroids--二分图最大匹配--Konig
- poj3041 二分图 最大匹配数
- (二分图最大匹配) poj3041 Asteroids
- 二分图匹配——POJ3041
- poj3041 匈牙利算法 二分图最大匹配
- POJ3041--二分图最大匹配模板
- 注入进阶之OS命令行注入
- 牛顿法与拟牛顿法
- [LeetCode] 分治之 Median of Two Sorted Arrays 课后题算法实现 Hard
- VR设备的链接与使用(脚本VRhouse)
- 算法(二):树,以及变形
- POJ3041(二分图匹配)
- poj 3258 River Hopscotch
- Linux下unzip命令出现 command not found的解决办法
- Ubuntu下用vi打开文本的^M问题
- 密码强度的正则验证
- Graph Theory NO.7_HDU_1233_还是畅通工程_最小生成树
- ccf 公共钥匙盒 模拟
- 63.Scala中隐式类代码实战详解
- Slam设计模式