自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

转载 二分最优匹配,KM算法详解

二分图的最优匹配(KM算法)KM算法用来解决最大权匹配问题: 在一个二分图内,左顶点为X,右顶点为Y,现对于每组左右连接XiYj有权wij,求一种匹配使得所有wij的和最大。基本原理  该算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转化为求完备匹配的问题的。设顶点Xi的顶标为A[ i ],顶点Yj的顶标为B[ j ],顶点Xi与Yj之间的边权为w[i,j]。在算法执行

2016-07-31 10:20:27 2769

原创 HDU 3395 Special Fish(KM)

这是一道KM模板题,函数部分都是一样的,只是建图不同。这里的建图是如果01矩阵中数字是1的话,那么第i条鱼攻击第j条鱼时,所产生的鱼卵数是第i条鱼和第j条鱼的异或值;#include#include#include#include#include#define N 110using namespace std;int link[N],mat[N][N],vx[N],vy[N],

2016-07-31 10:14:32 310

原创 Openj_Bailian_4118:开餐馆(动态规划)

Description北大信息学院的同学小明毕业之后打算创业开餐馆.现在共有n 个地点可供选择。小明打算从中选择合适的位置开设一些餐馆。这 n 个地点排列在同一条直线上。我们用一个整数序列m1, m2, ... mn 来表示他们的相对位置。由于地段关系,开餐馆的利润会有所不同。我们用pi 表示在mi 处开餐馆的利润。为了避免自己的餐馆的内部竞争,餐馆之间的距离必须大于k。请你帮助小明选择一

2016-07-30 20:13:09 921

原创 Lightoj 1078(模拟取余)

这道题其实就是个手动模拟除法的过程,每次对所得余数*10+后面的一位数字重新得到一个数,循环此过程直到整除就行了;#include#include#include#include#include#define N 60using namespace std;int main(){ int t,n,d,k,h; scanf("%d",&t); k=0;

2016-07-30 20:07:46 407

原创 1061:青蛙的约会

解题思路:因为可以把路径看成一个环,那么对青蛙每次跳跃后再对路径的长度取模,就是青蛙此时的坐标。判断两者青蛙坐标是否相等,相等的话输出坐标就行。如果两只青蛙在同时回到起点时还没有相遇,则永远不能相遇;#include#include#include#include#include#define N 110using namespace std;int main(){

2016-07-30 20:03:54 250

原创 Lightoj 1198 (KM模板题)

套用KM模板就行了,一道模板题,注意建图就行。#include#include#include#include#include#define N 60using namespace std;int vx[N],vy[N],lx[N],ly[N],link[N],mat[N][N];int n;int dfs(int t){ int i; vx[t]=1;

2016-07-30 20:00:09 329

原创 Lightoj 1152 Hiding Gold

藏黄金。先计算出黄金的总共数量,并一一进行编号,从1开始,然后四个方向进行判断,看是否有和黄金相连的另一块黄金,有的话建立一条边,最终形成一个二分图,这个二分图的最大匹配再除2就是公用一块布条的黄金,用黄金总数减去他就是答案了= =#include#include #include #include#include#include#define N 1100using n

2016-07-28 21:50:23 283

原创 poj3368 Frequent values(RMQ)

给你一串序列,再给你一个区间,求在这个区间内同一个数字出现频率最高的是多少,序列是非递减的序列;比如,-1 -1 1 1 1 1 3 10 10 10,在区间(5,10)中,出现频率最高的数字是10,频率为3,因此答案为3;一道RMQ的题目,解题思路写在代码注释里;#include#include#include#include#define N 100010int d

2016-07-28 15:12:14 299

原创 poj3790 最短路径问题

最短路,用迪杰斯特拉算法做就行,不过要注意边的松弛条件,距离优先,先比较距离选择最小的,然后更新距离数组和价值数组,在距离相等的情况下再比较价值,选择价值最小的来更新;#include#include#includeint dis1[1100],dis[1100],e[1100][1100],bo[1100],e1[1100][1100];int inf=1e10;int main

2016-07-27 23:30:26 381

原创 poj1537 Robot Motion

题意很清楚,就是一道搜索的题,按照字母代表的方向走,一步步来就行了,把走过的点从0开始依次变为0、1、2、3、……,当出边或者又再次碰到相同的点时候返回;#include#include#include#includeint m,n,st,step,flag;int b[50][50],a[50][50];char s[50][50];int dfs(int x,int y){

2016-07-27 19:02:38 273

原创 poj3278 Catch That Cow(BFS)

一道bfs题,可以通过搜索+1、-1、*2这三种情况来判断,bfs是广度搜索,当第一次n==k时,就是最小的步骤,可直接输出;这里用c++的队列来写比较方便,无奈弱暂时不会,就手动写了一个数组模拟队列的进出= =下面贴上代码:#include#include#include#include#define N 200010int n,k;int b[N],que[N],ste

2016-07-27 18:51:04 243

原创 poj3259 Wormholes(bellman负权处理)

思路:用bellman建立无向边,然后将虫洞的边置为负值求最短路,在进行n-1次松弛后,判断是否还能继续松弛。如果可以,则有负权回路,则可以在出发前回到原地,输出YES,否则,NO;#include#include#include#include#define N 6000//建立无向边时注意N的范围相应的扩大为二倍int u[N],v[N],w[N],dis[N];int n,m

2016-07-26 20:56:38 252

原创 hdu1548 a strange lift

这道题可以用BFS来做,也可以用最短路算法来做,建好图就可以了。#include#includeint main(){ int a,B,i,n,u,v,j,min; int inf=99999999; int dis[220],b[220],e[220][220],k[220]; while(scanf("%d",&n),n!=0) {

2016-07-26 19:20:25 221

原创 poj1511Invitation Cards

题目让求从起始点到各个路口来回花费的钱之和的最小值是多少,类似于poj3268,正着建个图,再反向建个图,计算两者的最小值之和就可以了;但是这道题数据比较大,用邻接矩阵会超时也会爆内存,需要用邻接表来建图;要注意题目给的数据过于大,注意类型溢出以及合适的inf值;#include#include#include#include#define N 1000006const int in

2016-07-26 18:08:45 733

原创 hdu1083 COURSES(匈牙利水题)

一道匈牙利算法的水题,题目让求恰好满足:1,每个学生都要选一门课程;2,每个课程都有一个学生选择。很明显,求出二分图的最大匹配数,如果等于课程数目,就YES,不等就NO;#include#include#include#define N 310int n,p;int used[N],mat[N][N],link[N];int dfs(int t){ int i;

2016-07-25 20:34:23 227

原创 hdu1151(最小路径覆盖)

求二分匹配最小路劲覆盖问题,最小路径覆盖=节点数-最大匹配数;#include#include#include#define N 1100int n,m;int used[N],link[N],mat[N][N];int dfs(int t){ int i; for(i=1;i<=n;i++) { if(used[i]==0&&mat[t]

2016-07-25 17:57:35 314

原创 hdu1068Girls and Boys(求二分图的最大独立集)

这道题是让求最大独立集,最大独立集=节点数-最大匹配数;建好图后套用模板就行了;#include#include#include#define N 1100int n;int used[N],mat[N][N],link[N];int dfs(int t){ int i; for(i=0; i<n; i++) { if(used[i]==

2016-07-25 17:55:22 274

原创 hdu2119 Matrix

由题意可知,这其实就是让求最小覆盖点;在二分图中,选取最少的点数,使这些点和所有的边都有关联(把所有的边的覆盖),叫做最小点覆盖。可知 、最小点覆盖数 = 最大匹配数(证明略,自行百度);则按照求最大匹配数的模板来就可以了;#include#include#includeint n,m;int used[110],link[110],mat[110][110];int df

2016-07-25 13:41:03 284

原创 hdu2063 过山车

这是一个二分匹配最最基础的题,完全套着模板来就可以,注意一下数组的初始化就可以了;#include#include#includeint m,n;int used[550],link[550],mat[550][550];int dfs(int t){ int i; for(i=1;i<=n;i++) { if(used[i]==0&&mat

2016-07-25 13:37:08 301

原创 hdu1317 负权最短路(Floyd+bellman)

首先要读懂题,做这个题时读题看样例琢磨了半天才明白= =;题目的意思是,一个人从一号房间走到最后一个房间,每个房间有相应的能量值(可正可负),当走到这个房间的时候可以获取这个房间的能量值,如果走到最后一个房间时,人的能量值为正,则“winnable"”,否则的话就"hopeless",另外,这个人一开始自身有100点能量值,房间可以重复的走,且第一个房间和最后一个房间的能量值为零。首先输入

2016-07-24 12:45:50 1043

原创 poj2253 Frogger

题意是让求从源点到目标点青蛙每次跳跃的最小距离是多少,并且可以借助中间的石块。这道题类似于poj1797,用Floyd来做就很简单了。可以转变为用所给的石块的坐标来求出每两个点之间的距离,以此为边来构建一个无向图,求出从源点到目标点每次跳跃的最小距离是多少。注意这个时候边的松弛条件就要相应的改变为如果(e[i][j]>Max(e[i][k],e[k][j])),则更新e[i][j];最后输出e

2016-07-22 14:03:30 308

原创 poj3660 Cow Contest

题意大致为,给你N头牛,他们之间进行进行M场比赛来确定排名,如果A赢B,B赢C,相应的可以确定A赢C;问最后可以确定排名的牛共几头;可以用Floyd算法来解决,利用一个中间变量k,用e[i][j]来表示i与j之间的比赛结果,若i与j之间有比赛,则e[i][j]=1;制作一个有向图,若i赢j,则顶点i指向顶点j有一条路;最后求出每个顶点的出度和入度之和,看是否等于n-1,若等,则可以确定此牛

2016-07-22 11:53:47 253

原创 poj1797 Heavy Transportation

题目让求从源点到N的最大载重量,这是一道最短路Dijkstra的变形,稍加改动就可以了。#include#includeint b[1100],dis[1100],e[1100][1100];int Min(int a,int b){ return a<b?a:b;}int main(){ int m,n,t1,t2,t3,i,j,v,u,max,T,k;

2016-07-21 17:55:46 237

原创 poj2387 Til the Cows Come Home

最短路模板题,套用模板就行。#include#includeint b[1100],dis[1100],e[1100][1100];int main(){ int m,n,t1,t2,t3,i,j,v,u,min; int inf=99999999; while(~scanf("%d%d",&m,&n)) { for(i=1; i<=

2016-07-21 17:49:23 250

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除