2012年8月13日

POJ 1325 Machine Schedule

摘要: 首先构造二部图,把A的n个model和B的n个model看作图的顶点,如果某个任务可以在A上的_imodel或者B上的_jmodel上完成,则Ai,Bj链接一条线,建立一个关系。那么本体就转化为求二部图的最小点覆盖集问题了View Code 1 #include<iostream> 2 using namespace std; 3 #define MAXN 105 4 int n1,n2; 5 int hn; 6 int g[MAXN][MAXN]; 7 int ans; 8 int sx[MAXN],sy[MAXN]; 9 int cx[MAXN],cy[MAXN];10 11 阅读全文

posted @ 2012-08-13 23:38 我的ACM之路 阅读(190) 评论(0) 推荐(0) 编辑

POJ 1469 COURSES

摘要: 很明显,本题目求的是二分图的最大匹配问题,只要匹配等于课程门数,就可以结束程序输出“YES”,否则当循环完之后还没有覆盖住所有的课程,则输出‘NO’View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define MAXN 301 6 int match[MAXN]; 7 int map[MAXN][MAXN]; 8 int vis[MAXN]; 9 int P,N; 10 int find(int x)11 {12 f 阅读全文

posted @ 2012-08-13 23:32 我的ACM之路 阅读(206) 评论(0) 推荐(0) 编辑

HDU 1068 Girls and Boys

摘要: 题目可以很容易的转化为先求二分图的最大匹配,然后拿总人数减去最大匹配值就得到最终结果。题目关键是建立关系图,因为是男和女的关系,但输入数据的时候没有说明那个学号是那那个学号是女,所以你就建立一个总人数*总人数的关系矩阵,求得的最大匹配值除以2就可以了,因为相同的增广链你求了两边。代码如下;View Code 1 #include<iostream> 2 using namespace std; 3 #include<cstdio> 4 #include<cstring> 5 #include<vector> 6 #define MAXN 1010 阅读全文

posted @ 2012-08-13 23:27 我的ACM之路 阅读(575) 评论(0) 推荐(0) 编辑

HDU 2063 过山车

摘要: 简单的最大二分图匹配View Code 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 #include<cstdio> 5 #include<cstring> 6 7 #define MAXN 505 8 9 int match[MAXN];10 int map[MAXN][MAXN];11 int vis[MAXN];12 int K,M,N; 13 14 int find(int x)15 {16 for(int i=1;i<=N;i++)17 { 18 阅读全文

posted @ 2012-08-13 23:21 我的ACM之路 阅读(174) 评论(0) 推荐(0) 编辑

POJ 3041 Asteroids 题解

摘要: 简单的二分图最大匹配View Code 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 #include<cstdio> 5 #include<cstring> 6 7 #define MAXN 510 8 9 int match[MAXN];10 int map[MAXN][MAXN];11 int vis[MAXN];12 int K,M,N; 13 14 int find(int x)15 {16 for(int i=1;i<=N;i++)17 { 18 阅读全文

posted @ 2012-08-13 23:18 我的ACM之路 阅读(211) 评论(0) 推荐(0) 编辑

POJ 1422 Air Raid

摘要: 二分图的最少边匹配,即找出最少的边可以覆盖所有的点。用匈牙利算法找出最大匹配,则最终结果为:ans = 图的顶点数 - 最大匹配。代码如下: 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 #include<cstdio> 5 #include<cstring> 6 7 #define MAXN 125 8 9 int match[MAXN];10 int map[MAXN][MAXN];11 int vis[MAXN];12 int n,m; 13 14 int 阅读全文

posted @ 2012-08-13 23:09 我的ACM之路 阅读(229) 评论(0) 推荐(0) 编辑

HDU 棋盘游戏 题解

摘要: 刚刚读这一题时以为这一题与Fire Net一样,后来才发现题目上面阴影部分不影响车的相互攻击,这就说明一行一列只能最多放置一个车。这一题目求放置最多车数目比较好求,直接就是二分匹配最大点集,关键是求重要点个数,那么我们可以依次去掉关联边,再求增广链,看求得的结果与开始求得的结果是否相同,如果不相同,则说明存在一个关键点。删边的代码:1 for(int i=1;i<=K;i++)2 {3 map[e[i][0]][e[i][1]]=0;4 int xx=getR();5 ... 阅读全文

posted @ 2012-08-13 23:05 我的ACM之路 阅读(992) 评论(1) 推荐(0) 编辑

二分匹配KM算法

摘要: 【KM算法及其具体过程】 (1)可行点标:每个点有一个标号,记lx[i]为X方点i的标号,ly[j]为Y方点j的标号。如果对于图中的任意边(i, j, W)都有lx[i]+ly[j]>=W,则这一组点标是可行的。特别地,对于lx[i]+ly[j]=W的边(i, j, W),称为可行边; (2)KM算法的核心思想就是通过修改某些点的标号(但要满足点标始终是可行的),不断增加图中的可行边总数,直到图中存在仅由可行边组成的完全匹配为止,此时这个匹配一定是最佳的(因为由可行点标的的定义,图中的任意一个完全匹配,其边权总和均不大于所有点的标号之和,而仅由可行边组成的完全匹配的边权总和等于所有点的标 阅读全文

posted @ 2012-08-13 21:19 我的ACM之路 阅读(1265) 评论(1) 推荐(0) 编辑

导航