03 2013 档案

摘要:这题就是用有向图的强连通分量来写,然后缩点,再找出入度为0的点的个数,就是答案注意:不知道为啥要动态分配内存...不这样就RE....郁闷// File Name: 11504.cpp// Author: Zlbing// Created Time: 2013/3/29 14:00:14#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set>#include<map>#i 阅读全文
posted @ 2013-03-29 15:43 z.arbitrary 阅读(540) 评论(0) 推荐(0)
摘要:一道DFS题..不说了,说多了全是泪..// File Name: 11396.cpp// Author: Zlbing// Created Time: 2013/3/29 12:13:47#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set>#include<map>#include<vector>#include<cstring>#inclu 阅读全文
posted @ 2013-03-29 13:56 z.arbitrary 阅读(319) 评论(0) 推荐(0)
摘要:题意:有N个人竞选,有M个投票人,每个投票人对竞选者都有个排序.投票人对于两个竞选者,他会投排在前面的竞选者的票.每次有2个竞选人出来竞选,失败者退出,获胜者则回到竞选候选人里,直到最后一人.现在你想要某人S获胜,并且你能随意安排两个人出来竞选.分析:构图,每两个人A,B,若A获的票数大于B,则连A->B的边,否则连B->A的边.最后求S是否能遍历整个图,若能遍历则输出"yes",否则输出"no";// File Name: 11748.cpp// Author: Zlbing// Created Time: 2013/3/28 20:36: 阅读全文
posted @ 2013-03-28 21:52 z.arbitrary 阅读(295) 评论(0) 推荐(0)
摘要:题意:求A到B所需要的能量,顺着水流走不需要能量,否则每走一步需要需要1个单位能量.分析:BFS+优先队列..太弱了,感觉这题放在比赛估计会写不出来,囧啊,,搜索都快不会了...// File Name: 11573.cpp// Author: Zlbing// Created Time: 2013/3/28 18:38:50#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set># 阅读全文
posted @ 2013-03-28 19:50 z.arbitrary 阅读(274) 评论(0) 推荐(0)
摘要:题意:在X轴上有N个城市,每个城市的坐标为Xi,每个城市的人有pi个,每个城市的不满意度为发射塔到这个城市的距离乘以这个城市的人数,求发射塔在那个位置才能使所有城市的不满意度之和最小.分析:我们可知若每个城市的人数都是一个,则中间位置是最佳位置,但这题xi城市有pi人,我们可以把他们看成有pi个城市xi,每个城市1人...故我们就可以很好求解了.所以我们将城市按位置排序,然后从左到右累加城市的人数的和S,直到S大于等于总人数的一半,即这个城市是最佳位置放置发射塔.// File Name: 114.cpp// Author: Zlbing// Created Time: 2013/3/27 1 阅读全文
posted @ 2013-03-27 15:06 z.arbitrary 阅读(260) 评论(0) 推荐(0)
摘要:题意:求有多少个数的平方不大于大数N;1≤N≤101000分析:java大数二分import java.util.Scanner;import java.math.*;public class Solution { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner cin=new Scanner(System.in); BigInteger bb; wh... 阅读全文
posted @ 2013-03-27 13:25 z.arbitrary 阅读(311) 评论(0) 推荐(0)
摘要:题意:给出一个n*m的字符矩阵T,你的任务是找出给定的x*y的字符矩阵P在T中出现了多少次.分析:要想整个矩阵匹配,至少各行都得匹配。所以先把P的每行看做一个模式串构造出AC自动机,然后在T中的各行逐一匹配,找到P中每一行的所有匹配点。只要在匹配时做一些附加操作,就可以把匹配出来的单一的行拼成矩形。用一个d[r][c]表示T中一(r,c)为右上角,与P等大的矩形中有多少个完整的行和P对应位置的行完全相同.当P的第i行出现在T的第r行,起始列编号为c时,意味着d[r-i][c]应当加1.所有匹配结束后,d[r][c]=X的那些就是一个二维匹配点.注意:模式串有可能相同,因此需要一个链表来相同的模 阅读全文
posted @ 2013-03-23 20:14 z.arbitrary 阅读(1225) 评论(0) 推荐(0)
摘要:刘汝佳新书-----训练指南题意:给出一些字符和各自对应的选择概率,随机选择L次后将得到一个长度为L的随机字符串S.给出K个模版串,计算S不包含任何一个串的概率分析:构造AC自动机之后,没随机生成一个字母,相当于在AC自动机中随机走一步.所有单词结点标记为"禁止",则本题就是求从结点0开始走L步,不进入任何静止结点的概率.d[i][j]表示当前在结点i,还要走j步,不碰到任何禁止结点的概率.在计算last的语句后面加一个val[u]|=val[f[u]],来计算禁止结点// File Name: 11468.cpp// Author: zlbing// Created Time: 2013/3 阅读全文
posted @ 2013-03-23 14:20 z.arbitrary 阅读(879) 评论(0) 推荐(0)
摘要:刘汝佳新书---训练之南题意:求模板串中与文本串匹配最多次数的模板分析:使用AC自动机,因为模板串有相同的,故用map<string,int>来判重// File Name: 1449.cpp// Author: zlbing// Created Time: 2013/3/19 11:00:17#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set>#include< 阅读全文
posted @ 2013-03-19 19:46 z.arbitrary 阅读(429) 评论(0) 推荐(0)
摘要:const int SIGMA_SIZE = 26;const int MAXNODE = 11000;const int MAXS = 150 + 10;map<string,int> ms;//ms是为了满足特殊要求,比如模板串相同时struct ACautomata { int ch[MAXNODE][SIGMA_SIZE]; int f[MAXNODE]; // fail函数 int val[MAXNODE]; // 每个字符串的结尾结点都有一个非0的val int last[MAXNODE]; // 输出链表的下一个结点 int cnt[MAXS]; int sz... 阅读全文
posted @ 2013-03-19 19:38 z.arbitrary 阅读(1259) 评论(0) 推荐(0)
摘要:#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set>#include<map>#include<vector>#include<cstring>#include<stack>#include<cmath>#include<queue>using namespace std;#define CL(x,v); m 阅读全文
posted @ 2013-03-18 14:05 z.arbitrary 阅读(193) 评论(0) 推荐(0)
摘要:题意:给定一个长度为n的字符串,求它每个前缀的最短循环节分析:KMP的失配函数有一个特点,i表示前i个字符,若i%(i-f[i])==0,则前i个字符,最短循环节的长度为i-f[i]。。// File Name: 1328.cpp// Author: zlbing// Created Time: 2013/3/17 19:22:33#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set&g 阅读全文
posted @ 2013-03-17 20:05 z.arbitrary 阅读(191) 评论(0) 推荐(0)
摘要://f[i+1]是求与p[i]的下一个匹配的后一个数的下标int f[MAXN];void getFail(char *p,int *f){ int m=strlen(p); f[0]=f[1]=0; for(int i=1;i<m;i++){ int j=f[i]; while(j&&p[i]!=p[j])j=f[j]; f[i+1]=p[i]==p[j]?j+1:0; }}void find(char *T,char *p,int *f){ int n=strlen(T); int m=strlen(p); ... 阅读全文
posted @ 2013-03-17 19:54 z.arbitrary 阅读(171) 评论(0) 推荐(0)
摘要:刘汝佳新书---------训练指南题意:求N个字符串两两比较,共比较了多少次?分析:将N个字符串插入前缀树,‘\0’也插入,这样就能区分字符串的终结点(以前我们都没插入)。这个很巧妙,不需要标识点标识字符终结点了,Orzz大牛!这样我们就能从前缀树中算出次数。字符串S1,S2的比较分这几种情况S1与S2的共同前缀S,则比较次数为len(S)*2+1但S1相同与S2,则比较次数为 len(S1+1)*2// File Name: 11732.cpp// Author: zlbing// Created Time: 2013/3/16 13:28:15#include<iostream&g 阅读全文
posted @ 2013-03-16 23:40 z.arbitrary 阅读(580) 评论(0) 推荐(0)
摘要:void out(int a) { if(a < 0) {putchar('-'); a = -a;} if(a >= 10)out(a / 10); putchar(a % 10 + '0'); } int in() { int flag = 1; char ch; int a = 0; while((ch = getchar()) == ' ' || ch == '\n'); if(ch == '-') flag = -1; else a += ch - '0'; whil... 阅读全文
posted @ 2013-03-16 15:53 z.arbitrary 阅读(482) 评论(0) 推荐(0)
摘要:import java.util.*;import java.math.*;public class Solution { public static void main(String args[]){ Scanner in=new Scanner(System.in); int a=in.nextInt(); int b=in.nextInt(); BigInteger x=BigInteger.valueOf(a); BigInteger y=BigInteger.valueOf(b); x=x.po... 阅读全文
posted @ 2013-03-14 20:36 z.arbitrary 阅读(221) 评论(0) 推荐(0)
摘要:刘汝佳新书--训练指南题意:给出N个不同单词和一个长字符串S。把这个字符串分解成若干个单词的连接(单词尅重复使用),问有多少种方法?分析:令d[i]表示从字符i开始的字符串的分解方案数,则dans[i]=sum{dans[i+d[x]] | 单词x是S[i...len]的前缀};// File Name: 1401.cpp// Author: zlbing// Created Time: 2013/3/14 18:55:52#include<iostream>#include<string>#include<algorithm>#include<cst 阅读全文
posted @ 2013-03-14 20:01 z.arbitrary 阅读(539) 评论(0) 推荐(0)
摘要:Trie树也叫前缀树用来保存字符串集刘汝佳新书----训练指南前缀树模版const int maxnode = 4000 * 100 + 10;const int sigma_size = 26;// 字母表为全体小写字母的Triestruct Trie { int ch[maxnode][sigma_size]; int val[maxnode]; int sz; // 结点总数 void clear() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); } // 初始时只有一个根结点 int idx(char c) { return c - '. 阅读全文
posted @ 2013-03-14 19:50 z.arbitrary 阅读(153) 评论(0) 推荐(0)
摘要:wa成屎了。。。还是没过!-----------------------------过了!!!各种bug啊。。。刚才又瞄了一眼,发现移位多写了一个1。我草。fuck! 题意:给出一个长度为n的整数序列D,你的任务是对m个询问做出回答。对于询问(a,b),需要找到两个下标x,和y,使得a<=x<=y<=b,并且Dx+Dx+1+....+Dy尽量大。如果有多组满足条件的x和y,x尽量小。如果还有多个解,y应该尽量小分析:这个需要应用求最大连续子序列的分治算法:最优解要么完全在左半序列,要么完全在右半序列,要么跨越中点;构造一颗线段树,其中每个结点维护3个值:区间最大连续和max_ 阅读全文
posted @ 2013-03-13 20:25 z.arbitrary 阅读(1447) 评论(2) 推荐(0)
摘要:http://www.notonlysuccess.com/index.php/segment-tree-complete/#include <cstdio>#include <algorithm>using namespace std; #define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1const int maxn = 111111;int h , w , n;int col[maxn<<2];int sum[maxn<<2];void Pus 阅读全文
posted @ 2013-03-12 11:39 z.arbitrary 阅读(1275) 评论(1) 推荐(0)
摘要:http://www.notonlysuccess.com/index.php/segment-tree-complete/线段树功能:update:单点增减 query:区间求和#include <cstdio> #define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1const int maxn = 55555;int sum[maxn<<2];void PushUP(int rt) { sum[rt] = sum[rt<<1] + sum[rt<< 阅读全文
posted @ 2013-03-12 11:37 z.arbitrary 阅读(179) 评论(0) 推荐(0)
摘要:题意:给一个数组,然后问你在区间(L,R)里相同数字出现的最多次数。。分析:因为是非降序的,所有相同的元素会聚集到一起。这个就可以把整个数组进行编码,变成出现次数为数组的值的数组,然后求区间的最大值即可。比如-1,1,1,2,2,2,4就可以编码成(-1,1)(1,2)(2,4)(4,1),其中(a,b)表示有b个连续的aG[i]为第i段的值,cnt[i]为第i段的个数,F[i]为第i段的左端点位置,R[i]为第i段右端点的位置,pos[i]为第i个数所在的段// File Name: 11235.cpp// Author: zlbing// Created Time: 2013/3/9 21 阅读全文
posted @ 2013-03-10 17:43 z.arbitrary 阅读(329) 评论(0) 推荐(0)
摘要:题意是求一个欧拉路,并以字典序输出要欧拉路以字典序输出,则一开始将边进行排序,然后构图,选择字典序最小的可用点作为开始点查找欧拉路,然后倒序输出,即可。(不知道证明。。。。。)// File Name: 2337.cpp// Author: zlbing// Created Time: 2013/3/10 15:36:00#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set>#in 阅读全文
posted @ 2013-03-10 16:38 z.arbitrary 阅读(257) 评论(0) 推荐(0)
摘要:题意:有N个乒乓球运动员,他们每个人都有自己的技能值,且各不相等。现在问你从中选出两个运动员和一个教练组成一场比赛,且要求教练要在两个运动员中间,教练的技能值也要在两个运动员之间。分析:假设选中A[i]当作教练,则我们需要知道A[0]~A[i-1]有ai个小于A[i],者我只需对前i个插入树状数组中有几个小于A[i]几个,也就是求1~A[i]的前缀和。。同理也可以从右往左再用一遍树状数组,即可得A[i+1]~A[n-1]有bi个大于A[i]。。Si=ai*bi+(i-ai)*(n-i-1-bi),再求S和,我们就可以得到结果。感觉自己的文字描述语言弱爆了。。。!!!请原谅// File Nam 阅读全文
posted @ 2013-03-09 18:57 z.arbitrary 阅读(315) 评论(0) 推荐(0)
摘要:题意:有N个结点,初始时每个结点的父节点都不存在。你的任务是执行一次I操作和E操作,格式如下。I u v:把结点u的父节点设为v,距离为|u-v|除以1000的余数。输入保证执行指令前u没有父节点。E u:询问u到根节点的距离分析:因为题目只查询结点到根节点的距离,所以每棵树除了根节点不能换之外,其他结点的位置可以任意改变,这恰好符合并查集的特点,但是需要记录附加信息。// File Name: 1329.cpp// Author: zlbing// Created Time: 2013/3/8 22:06:16#include<iostream>#include<strin 阅读全文
posted @ 2013-03-08 22:34 z.arbitrary 阅读(376) 评论(0) 推荐(0)
摘要:一道简单的并查集。。题意其实就是判断是否有环。。// File Name: 1160.cpp// Author: zlbing// Created Time: 2013/3/8 21:26:11#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set>#include<map>#include<vector>#include<cstring>#inc 阅读全文
posted @ 2013-03-08 21:39 z.arbitrary 阅读(216) 评论(0) 推荐(0)
摘要:刘汝佳新书---训练指南题意:有K个整数数组,包含K个元素。在每个数组中取一个元素加起来,可以得到k^k个和。求这些和中最小的K个值分析:这题有简化版本的,即2个整数数组A,B,包含K个元素,在每个数组中取一个元素加起来,可以得到k^2个和,求这些和中最小的K个值。我们需要把这k^2个和组织成如下k个有序表.表1:A1+B1<=A1+B2<=......<=A1+Bk表2: A2+B1<=A2+B2<=......<=A2+Bk表k:Ak+B1<=AK+B2<=......<=Ak+Bk我们可以用二元组(s,b)来表示一个元素即s=Aa+B 阅读全文
posted @ 2013-03-08 21:12 z.arbitrary 阅读(1206) 评论(4) 推荐(0)
摘要:题意:你的任务是编写一个称为argus的系统。该系统支持一个register命令 Register Q_num Period该命令注册了一个触发器,它每个Period秒钟就会产生一次编号为Q_num的事件。你的任务是模拟出前K个事件。如果多个事件同时发生,先处理Q_num小的事件。分析:用优先队列来维护每个触发器的“下一个事件“,然后每次从中取出最早发生的一个事件,重复K次即可。// File Name: 1203.cpp// Author: zlbing// Created Time: 2013/3/6 18:18:19#include<iostream>#include< 阅读全文
posted @ 2013-03-08 20:13 z.arbitrary 阅读(238) 评论(0) 推荐(0)
摘要:刘汝佳新书--训练指南这是一道用STL解决的题,STL是神奇啊。题意:给出一组数组,求v从左到右第K次出现的下标。分析:因为数组有10^6规模,查询也有10^6规模,若是只用数组的话,肯定存储不了。。// File Name: 11991.cpp// Author: zlbing// Created Time: 2013/3/6 14:59:29#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include&l 阅读全文
posted @ 2013-03-06 15:22 z.arbitrary 阅读(193) 评论(0) 推荐(0)
摘要:struct Edge{ int from,to,cap,flow,cost;};struct MCMF{ int n,m,s,t; vector<Edge>edges; vector<int> G[MAXN]; int inq[MAXN]; int d[MAXN]; int p[MAXN]; int a[MAXN]; void init(int n){ this->n=n; for(int i=0;i<=n;i++)G[i].clear(); edges.clear(); } void... 阅读全文
posted @ 2013-03-04 21:23 z.arbitrary 阅读(196) 评论(0) 推荐(0)
摘要:题意:有个方阵,每个格子里都有一个非负数,从左上角走到右下角,每次走一步,只能往右或往下走,经过的数字拿走,换0每次都找可以拿到数字和最大的路径走,走k次,求最大和分析:最大费用最大流。因为点有权值,所以一般的做法是拆点,将一个点拆成两个点a和a',点的费用为权值,容量为1,然后再建一条边,边的费用为0,容量为INF,这样就能保证至少能通过这个点k次。。然后将a‘与右或下的点建一条边,边的费用为0,容量为INF..最后建一个超级源点和汇点,使之只能走k编。将超级源点与矩阵第一个点相连,费用为0,容量为k,超级汇点与矩阵最后一个点相连,费用为0,容量为k。这样,这个题的图就建完了。。一开 阅读全文
posted @ 2013-03-04 21:19 z.arbitrary 阅读(267) 评论(0) 推荐(0)
摘要:http://blog.csdn.net/lyy289065406/article/details/6742534题意:有N个供应商,M个店主,K种物品。每个供应商对每种物品的的供应量已知,每个店主对每种物品的需求量的已知,从不同的供应商运送不同的货物到不同的店主手上需要不同的花费,又已知从供应商Mj送第kind种货物的单位数量到店主Ni手上所需的单位花费。问:供应是否满足需求?如果满足,最小运费是多少?分析:一开始将一个点拆成K个点,给过TLE了。。后来看题解发现分别把k种商品用最小费用最大流算出来就行了。。只要其中一种不满足,结果输出-1。手打的最小费用最大流模版,结果打错了,调试了半天。 阅读全文
posted @ 2013-03-04 21:09 z.arbitrary 阅读(227) 评论(0) 推荐(0)
摘要:http://www.cnblogs.com/markliu/archive/2012/05/18/2508392.html题意:有N个农场,P条无向路连接。要从1到N不重复走T条路,求所经过的直接连接两个区域的道路中最长道路中的最小值,。构图:源点向1连容量T的边。二分最小长度,长度超过mid的边容量为0,否则为1,用最大流判可行性。注意:1.该题有重边,切忌用邻接矩阵删除重边(重边要用邻接表来处理以保留)。2.无向图在addedge中要进行处理(处理方式见代码)。// File Name: 2455.cpp// Author: zlbing// Created Time: 2013/3/3 阅读全文
posted @ 2013-03-03 17:26 z.arbitrary 阅读(1158) 评论(0) 推荐(0)
摘要:这题写了很久了,也看了许多题解。。可是发现都好复杂,看不懂啊,果然智商是硬伤。虽然知道这题是扩展欧几里德算法。。但是对与ax+by=c中系数的正负处理的不好,偶然看一题解发现处理的很好就抄袭了过来。Orz大神http://blog.csdn.net/jerryihuang/article/details/7992068这道题各种坑啊,各种讨论,各种bug,不过倒是学到不少,至少扩展欧几里德会用了,,,泪啊//求的是ax+by=gcd(a,b)的解,其中d=gcd(a,b),注意a>b,并且最好把a,b变成正数计算void exgcd(LL a,LL b,LL &d,LL & 阅读全文
posted @ 2013-03-03 02:04 z.arbitrary 阅读(323) 评论(0) 推荐(0)
摘要:刘汝佳新书--训练指南题意:给定一个有向网络,每条边均有一个容量。问是否存在一个从点1到点N,流量为C的流。如果不存在,是否可以恰好修改一条弧的容量,使得存在这样的流?分析:先求一次最大流,如果流量至少为C,则直接输出possible,否则需要修改的弧一定是最小割里的弧。依次把这些弧的容量增加到C,然后再求最大流,看最大流量是否至少为C即可。很可惜,这样写出来的程序会超时,还需要加两个重要的优化。第一个优化是求完最大流后把流量留着,以后每次在它的基础上增广,第二个优化是每次没必要求出最大流,增广到流量至少为C时就停下来。// File Name: dinic.cpp// Author: zlb 阅读全文
posted @ 2013-03-02 23:19 z.arbitrary 阅读(872) 评论(0) 推荐(0)
摘要:struct Edge{ int from,to,cap,flow;};bool cmp(const Edge& a,const Edge& b){ return a.from edges; vector G[MAXN]; bool vis[MAXN]; int d[MAXN]; int cur[MAXN]; void init(int n){ this->n=n; for(int i=0;i Q; Q.push(s); d[s]=0; vis[s]=1; while... 阅读全文
posted @ 2013-03-02 23:04 z.arbitrary 阅读(281) 评论(0) 推荐(0)
摘要:就是一个裸的最大流来当模版用也不错// File Name: 1273.cpp// Author: zlbing// Created Time: 2013/3/2 22:01:59#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define CL(x,v); memset(x,v,sizeof(x));#define INF 0x3f3f3f3f#define LL long long#define MAXN 阅读全文
posted @ 2013-03-02 23:03 z.arbitrary 阅读(169) 评论(0) 推荐(0)
摘要:刘汝佳新书--训练指南本题中时间是一个天然的序,因此可以构图如下:每个客人是一个点,如果同一个出租车在接完客人u以后来得及接客人v,连边u->v。不难发现这个图是一个DAG,并且它的最小路径覆盖就是本题的答案。最小路径覆盖=结点数-最大匹配数证明:DAG最小路径覆盖的解法如下:把所有结点i拆成X结点i和Y结点i',如果图G中存在有向边i->j,则在二分图中引入边i->j'。设二分图的最大匹配数为m,则结果就是n-m。为什么呢?因为匹配和路径覆盖是一一对应的。对于路径覆盖中的每条简单路径,除了最后一个“结尾结点”之外都有唯一的后继和它对应(即匹配结点),因此匹配数就是非尾结点的个数 阅读全文
posted @ 2013-03-01 21:18 z.arbitrary 阅读(322) 评论(0) 推荐(0)
摘要://初始时需要将w初始化为0int Left[MAXN];//Left[i]为左边与右边第i个点匹配的编号int w[MAXN][MAXN];bool S[MAXN],T[MAXN];int N;bool match(int i){ S[i]=true; for(int j=1;j<=N;j++)if(w[i][j]&&!T[j]) { T[j]=true; if(Left[j]==0||match(Left[j])) { Left[j]=i; return true; } ... 阅读全文
posted @ 2013-03-01 16:34 z.arbitrary 阅读(210) 评论(0) 推荐(0)
摘要:很明显的二分图,只是这题需要输出最小覆盖的点我们可以在求出最大匹配之后,以未覆盖的x点进行标记,沿着未覆盖->覆盖->未覆盖->覆盖...的路径标记,最后S中未标记的和T中标记的点构成最小点覆盖集。// File Name: 11419.cpp// Author: zlbing// Created Time: 2013/3/1 14:20:03#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#i 阅读全文
posted @ 2013-03-01 16:27 z.arbitrary 阅读(205) 评论(0) 推荐(0)
摘要:引用刘汝佳新书--训练指南稳定婚姻问题题意:在一个盛大的校园舞会上有n位男生和n位女生,每人都对每个异性有一个排序,代表对他们的喜欢程度。你的任务是将男生和女生一一配对,使得男生u和女生v不存在以下情况:(1)男生u和女生v不是舞伴;(2)他们喜欢对方的程度都大于喜欢各自当前的舞伴的程度。如果出现了(2)中的情况,他们可能会擅自抛下自己的舞伴,另外组成一对。你的任务是对于每个女生,在所哟可能和她跳舞的男生中,找出她最喜欢的那个。分析:本题就是著名的稳定婚姻问题,只是把结婚和配偶换成了跳舞和舞伴。下面用原题中的术语来介绍这个问题的Gale-Shapley算法。这个算法也称求婚-拒绝算法,因为算法 阅读全文
posted @ 2013-03-01 14:08 z.arbitrary 阅读(414) 评论(0) 推荐(0)