2011年7月19日

二分图匹配----匈牙利算法之六

摘要: poj 2226 Muddy Fields/*题意 :有R×C方阵,'*'表示洼地,需要铺上宽度为1的木板,长度不限,只能横放或竖放.木板可以重叠,但不能覆盖'.'求覆盖所有'*'洼地所用的最少木板数.构图: 将所有横向且连续(一个或以上)的'*'看成一个点并对其进行编号,所有的编号都为集合X内的编号。同样地,将所有的竖向且连续(一个或以上)的'*'看成一个点并对其编号,所有的编号都为集合Y内的编号对于原图里的'*',设其在横向X编号为i,在竖向Y编号为j,则在点 Xi 和点 Yj 间连一 阅读全文

posted @ 2011-07-19 21:39 sysu_mjc 阅读(162) 评论(0) 推荐(0) 编辑

二分图匹配----匈牙利算法之五

摘要: poj 3041 Asteroids//矩阵的行是集合X,矩阵的列是集合Y,将矩阵每一行看成集合X的点,每一列看成集合Y的点,//这样构成一个二分图,题目就是求二分图的最小覆盖点集(即最少的行和列),转化成二分图的最大匹配poj 3041 Asteroids#include<iostream> //求二分图的最小覆盖点集#include<cstring>using namespace std;int n,k,r,c;int edge[600][600],vis[600],result[600];bool find(int a){ for(int i=1;i<=50 阅读全文

posted @ 2011-07-19 21:38 sysu_mjc 阅读(151) 评论(0) 推荐(0) 编辑

二分图匹配----匈牙利算法之四

摘要: poj 2239 Selecting Courses//题意:一共有n门课程,每门课都有对应的几个可以选择的上课时间,为星期几的第几节。问你最多可能选择几门课?poj 2239 Selecting Courses#include<iostream> //二分图的最大匹配#include<cstring>using namespace std;int n,t,p,q;int edge[400][100],vis[100],result[100];bool find(int a){ for(int i=0;i<=83;++i) //当p=7,q=12,(p-1)*12 阅读全文

posted @ 2011-07-19 21:37 sysu_mjc 阅读(116) 评论(0) 推荐(0) 编辑

二分图匹配----匈牙利算法之三

摘要: poj 1325 Machine Schedule/*转自http://hi.baidu.com/%8E%E1%D0%B3/blog/item/b26cbd0a03b134dc62d98609.html:题意: 有两台机器A和B,分别有n种和m种不同的模式,有k个工作,每个工作都可以在那两个机器的某种特定的模式下处理,如job[0]既可以在A机器的3号模式下处理,也可以在B机器的4号模式下处理,机器的工作模式改变只能通过重启来改变,通过改变工作的顺序和分配每个工作给合适的机器可以减少重启机器的次数,题目要求的就是重启机器的最小次数,初始时两台机器都在0号模式下工作.这里假设某工作在A机器上的. 阅读全文

posted @ 2011-07-19 21:36 sysu_mjc 阅读(157) 评论(0) 推荐(0) 编辑

二分图匹配----匈牙利算法之二

摘要: poj 1469 COURSES//题意:现在有p门课程和n个学生,现在需要有由p个学生组成的组织,该组织满足每个学生代表一门课程以及每门课程只能由一个学生代表,//现给出每门课程都有哪些学生可以参加,要求判断是否存在满足题意所需要的组织.//求解二分图的最大匹配数,如果与p相等就输出"YES",否则输出"NO".poj 1469 COURSES#include<iostream> //二分图的最大匹配#include<cstring>using namespace std;int p,n;int result[301]; //r 阅读全文

posted @ 2011-07-19 21:34 sysu_mjc 阅读(140) 评论(0) 推荐(0) 编辑

二分图匹配----匈牙利算法之一

摘要: #include<iostream> //二部图匹配--匈牙利算法#include<cstring>using namespace std;int n1,n2,m;int result[101]; //result记录V2中的点匹配的点的编号int edge[101][101],vis[101]; //vis记录V2中的每个点是否被搜索过bool find(int a){ for(int i=1;i<=n2;++i) { if(edge[a][i]==1&&vis[i]==0) //如果节点i与a相邻并且未被查找过 { vis[i]=1; //标记 阅读全文

posted @ 2011-07-19 21:32 sysu_mjc 阅读(149) 评论(0) 推荐(0) 编辑

转载:二部图最小覆盖点集等于最大匹配-----König定理及其证明

摘要: 二分图最大匹配的König定理及其证明König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数。如果你还不知道什么是最小点覆盖,我也在这里说一下:假如选了一个点就相当于覆盖了以它为端点的所有边,你需要选择最少的点来覆盖所有的边。比如,下面这个图中的最大匹配和最小点覆盖已分别用蓝色和红色标注。它们都等于3。这个定理相信大多数人都知道,但是网络上给出的证明并不多见。有一些网上常见的“证明”明显是错误的。因此,我在这里写一下这个定理的证明,希望对大家有所帮助。假如我们已经通过匈牙利算法求出了最大匹配(假设它等于M),下面给出的方法可 阅读全文

posted @ 2011-07-19 17:13 sysu_mjc 阅读(360) 评论(0) 推荐(0) 编辑

sicily 1155. Can I Post the lette

摘要: #include <iostream> //求顶点1到n是否可达#include<stdio.h>#include<cstring>using namespace std;int n,m,edge[200][200];int seq[50000],vis[50000];int main(){ while(scanf("%d",&n),n) { memset(edge,0,sizeof(edge)); memset(vis,0,sizeof(vis)); int s,t; scanf("%d",&m); 阅读全文

posted @ 2011-07-19 10:45 sysu_mjc 阅读(359) 评论(0) 推荐(0) 编辑

导航