上一页 1 ··· 67 68 69 70 71 72 73 74 75 ··· 85 下一页
  2011年10月8日
摘要: CF 118C 这个题目可以暴力枚举变成0~9的情况,但究竟优先变哪一个位置需要分情况进行讨论,因此可以先按优先级将位置进行排序,依次改变该位置上的数字即可。#include<stdio.h>#include<string.h>#include<stdlib.h>int number, a[10010], b[11][10010], sum[11], r[10010];char str[10010];int cmp(const void *_p, const void *_q){ int *p = (int *)_p; int *q = (int *)_q; 阅读全文
posted @ 2011-10-08 16:05 Staginner 阅读(398) 评论(0) 推荐(0) 编辑
  2011年10月7日
摘要: HDU_2448 首先求出各个港口和船之间的最短路,然后用KM算法求二分图最优匹配即可。#include<stdio.h>#include<string.h>#define MAXD 110#define INF 1000000000#define MAX 100000int M, K, P, N, d[MAXD], G[MAXD][MAXD], yM[MAXD];int A[MAXD], B[MAXD], slack, visx[MAXD], visy[MAXD];int f[2 * MAXD][2 * MAXD];void init(){ int i, j, k, 阅读全文
posted @ 2011-10-07 21:28 Staginner 阅读(315) 评论(0) 推荐(0) 编辑
摘要: HDU_1533 由于图上每个点都可达,所以人和房子间的最短距离就是曼哈顿距离。建好图之后应用KM算法求二分图最优匹配即可。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 110#define MAX 10010#define INF 1000000000int N, hx[MAXD], hy[MAXD], px[MAXD], py[MAXD];int a[MAXD][MAXD], G[MAXD][MAXD], yM[MAXD];int A[MAXD], B[MAXD], s 阅读全文
posted @ 2011-10-07 19:35 Staginner 阅读(287) 评论(0) 推荐(0) 编辑
摘要: HDU_1598一开始用Floyd写,结果WA掉了,怀疑是两存在点之间有多条路的情况。后来想到二分差值、枚举下界、判连通,但由于我是从权值着眼,依次递增去枚举下界的,结果由于数据范围太大果断超时了。后来看了网上的报告,他直接把所有的边先进行排序,然后以边为单位进行枚举下界,我于是恍然大悟,因为边的数量很少,只有1000条,所以以边为单位枚举下界,确实是个不错的选择。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 210#define MAXM 1010int N, M, u[ 阅读全文
posted @ 2011-10-07 18:25 Staginner 阅读(371) 评论(0) 推荐(0) 编辑
  2011年10月6日
摘要: HDU_2813 为了避免读入数据时判重的超时,可以采用哈希去处理,然后再把不重复的人名取出来看做一个点,构图后再用KM算法求二分图最优匹配即可。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 210#define MAXM 40010#define INF 1000000000#define HASH 10007int headL[HASH], nextL[MAXM], headC[HASH], nextC[MAXM];int N, M, K, G[MAXD][MAXD], 阅读全文
posted @ 2011-10-06 01:49 Staginner 阅读(344) 评论(0) 推荐(0) 编辑
  2011年10月5日
摘要: HDU_2228这是一个二分图最优匹配的题目,但是一开始不知道怎么去构图,后来看了别人的思路之后不由得觉得构图十分巧妙。如果我们要移动巧克力,最后一定是把盒子中多余的巧克力移到空盒子中去,那么我们不妨以多出的每个巧克力以及每个空盒子为研究对象,这样每个巧克力只能放到一个空盒子中,每个空盒子也只能放一个巧克力,于是就可以构成一个二分图去求最优匹配了,其中边权为巧克力和空盒子的最短距离。当然为了能应用KM算法,我们在初始化边权的时候可以用MAXD减去最近距离作为边权,之后在统计结果的时候再将其还原即可。#include<stdio.h>#include<string.h># 阅读全文
posted @ 2011-10-05 20:35 Staginner 阅读(256) 评论(0) 推荐(0) 编辑
摘要: HDU_3395 我们可以把一条鱼拆成两个点分别代表攻击和被攻击,然后按题意对G[i][j]==1的边的权值设为value[i]^ value[j],之后用KM算法求二分图的最优匹配即可。#include<stdio.h>#include<string.h>#define MAXD 110#define INF 1000000000int yM[MAXD], G[MAXD][MAXD], N, value[MAXD];int A[MAXD], B[MAXD];int visx[MAXD], visy[MAXD], slack;char b[MAXD];int init( 阅读全文
posted @ 2011-10-05 19:36 Staginner 阅读(298) 评论(0) 推荐(0) 编辑
摘要: HDU_3772 我们可以把一个字符串拆成两个点分别代表入度和出度,然后用KM算法去做二分图最优匹配即可。#include<stdio.h>#include<string.h>#define MAXD 210#define INF 1000000000char b[MAXD][1010];int G[MAXD][MAXD] , yM[MAXD], N;int A[MAXD], B[MAXD], slack;int visx[MAXD], visy[MAXD];int check(char *str1, char *str2){ int i, j, num = 0; i 阅读全文
posted @ 2011-10-05 17:03 Staginner 阅读(219) 评论(0) 推荐(0) 编辑
摘要: HDU_3718我们首先要把字符串中的字符转化成意义相同的[0,k-1]之间的数,然后顺序扫描一遍数组,就可以得到两组数之间的各种匹配的最大值,这样就完成了建图。之后运用KM算法求最优匹配即可。#include<stdio.h>#include<string.h>#define MAXD 30#define MAXN 10010#define INF 1000000000char a[MAXN][5], b[MAXN][5];int visa[MAXN], visb[MAXN], x[MAXN], y[MAXN];int G[MAXD][MAXD], yM[MAXD], 阅读全文
posted @ 2011-10-05 15:29 Staginner 阅读(238) 评论(0) 推荐(0) 编辑
摘要: HDU_2853我们可以想到,如果我们从头开始匹配,如果最终部分匹配改变之后但没有影响到最终结果的话,那么实际上我们完全没有必要变成新的匹配方式。因而我们考虑为原有的边增加一个“喜好度”,保证其在不影响结果的前提下,会优先匹配原有的边。在处理数据的时候,我们可以把每条边扩大一定的值(我的程序里面是乘以10),然后将原有的边的权值自加1,这样当我们用KM重新进行匹配时,就体现出了优先选已有的边进行匹配,并且这样处理之后并不会影响最优匹配的生成。 最后统计结果的时候,我们对边权进行还原即可,其中更改的数量就是最优匹配中边权模10的结果不为0的边的数量。#include<stdio.h> 阅读全文
posted @ 2011-10-05 13:29 Staginner 阅读(435) 评论(4) 推荐(0) 编辑
上一页 1 ··· 67 68 69 70 71 72 73 74 75 ··· 85 下一页