上一页 1 2 3 4 5 6 7 8 9 ··· 17 下一页
摘要: 题意: 给出一个 n*m的矩阵,知道了每一行元素的和(n个),每一列元素的和(m个) 给出t个条件: a b c d 表示 a b 和 数字 d 满足条件 c分析: 此题的最大流有下界的限制,用上下界最大流求解时,需要先去掉下界,判断是否存在可行流将 1 到 n 行每行看作一个节点(1..n),将 1 到 m 列每列看作一个节点(n+1..n+m) 建立源点 s=0,汇点 t=n+m+1 在源点 s 和每一个行节点之间连一条上界是行数字的和下界为 0的边在每一个列节点和和汇点t之间连一条上界是列数字的和下界为 0的边 如果 i 行 j 列的数字大于 x,就在 i 行节点和 j 列节点之间... 阅读全文
posted @ 2012-08-22 19:28 'wind 阅读(307) 评论(0) 推荐(0) 编辑
摘要: 题意:给定带点权的有向无环图,求最大权闭合图权值,同时要使得选取的点数最小分析:建图: 建立源点 s=0,在 s 和 正权点之间连一条边权为该点值的边 建立汇点 t=n+1 在 负权点 和 t 之间连一条边权点为该点的绝对值的边 输入的边权值设为INF,求最大流,求最大流后,在残留网络中从s出发dfs能搜到点都为最大权闭合图中的点, 即这个最小割对应的是最大权闭合图然后让正权点值的累加和减去最大流 就是闭合图的最大权。#include<stdio.h>#include<string.h>#include<stdlib.h>#define clr(x)mems 阅读全文
posted @ 2012-08-21 00:22 'wind 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 题意: 对于从1到N (1 <= N <= 39) 的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的。举个例子,如果N=3, 对于{1,2,3}能划分成两个子集合,每个子集合的所有数字和是相等的:{3} 和 {1,2} 给出一个 N 值,问最多能划分成多少种等值的集合。分析:每个数字只用到一次,每种情况的存在数可以由之前的存在的数来递推得到,01背包的变形。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))long long f[50000];int 阅读全文
posted @ 2012-08-20 21:17 'wind 阅读(956) 评论(3) 推荐(0) 编辑
摘要: 题意: 给出一连串的表达式,需要求出他们的结果,并且需要判断这些结果能否首尾相连成一个串,如果可以输出字典最小的那个串。分析:表达式求解需要定义符号的优先级,并用栈来维护运算符和数值结果, 结果求出来后,可以对所有串按字典序排列,然后深搜找欧拉路径,第一次找到的即为字典序最小的那个。#include<stdio.h>#include<string.h>#include<stdlib.h>#define clr(x)memset(x,0,sizeof(x))int res[1005][3];struct node{ int f,l; char s[33];}q 阅读全文
posted @ 2012-08-19 22:19 'wind 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 题意: 知道了一些课程的开始和结束时间,要从中选择尽量多的课程,而且每五分钟只能选一次。分析: 因为每五分钟最多选一次,所以只要枚举总的开始时间,以后的时间就可以确定,总的开始时间最多为 4 种情况,找到其中的最大值即可。#include<stdio.h>#include<string.h>#include<stdlib.h>#define clr(x)memset(x,0,sizeof(x))struct node{ int st,en;}q[555];int v[555];int cmp(const void*p1,const void*p2){ nod 阅读全文
posted @ 2012-08-19 22:13 'wind 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 题意:为了降低出现暴动及逃跑事件的风险,两个相同容量的临近监狱的管理层决定重新安排他们的囚犯。他们想用一个监狱里一半的囚犯去交换另一个监狱里一半的囚犯 然而,从囚犯们犯罪史的存档信息可知某些囚犯成对被关在同一座监狱里时会很危险,这也是现今他们被分开的原因,即对于每对这样的囚犯,一名在第一个监狱服 刑,另一名在第二座监狱服刑。管理层认同将那些囚犯保持分开的重要性,但这也使得他们的新安排任务有些棘手,事实上,他们很快就了解到有时这个互换一半囚 犯的意愿是不可能达成的。每当这种情况下,他们不得不满足于交换尽可能接近一半数量的囚犯。分析:需要把第一座监狱和第二所监狱有联系的放到一起,形成一个连通块,即 阅读全文
posted @ 2012-08-19 21:59 'wind 阅读(282) 评论(0) 推荐(0) 编辑
摘要: 题意:恐怖分子在去年轰炸哈理工未遂后,打算今年卷土重来,学校为了预防恐怖分子潜入主楼,决定在今年9月份在每间教室安装摄像头,恐怖分子为了能够成 功潜入主楼,将要摧毁这些摄像头。 已知摄像头的安装是成网络状的,摄像头的连接是双向的。如果网络中任何两个摄像头之间至少有一条路,则该网络为连通的,否则不连通。一个空的网络 或只有一个摄像头的网络被认为是连通的。如果网络不连通,则导致摄像头主系统瘫痪,恐怖分子会成功潜入主楼。因为摄像头之间的连线是接在墙里的, 所以只能靠摧毁摄像头使网络不连通,做为恐怖分子头目的你,请你计算至少要摧毁多少个摄像头才能让你的手下成功潜入主楼。分析:使得网络不连通所需去除的最 阅读全文
posted @ 2012-08-19 21:52 'wind 阅读(294) 评论(0) 推荐(0) 编辑
摘要: 题意:Colugu市有n个车站和m条路。每条路直接连接两个车站,所有的路都是单向的。为了维护空气质量,政府停用了所有军队车辆。所以军队必须乘坐巴士去机场。两个车站之 间可能不只一条路。如果一个车站被摧毁,那么所有通向那个车站的道路都没用了。Gabiluso需要去做的是摧毁一些车站使得军队不能在k分钟内 赶到机场。一辆巴士通过一条路只需要一分钟。从1到n给所有车站编号。编号为1的车站在军营里,编号为n的车站在机场里。军队总是从编号为1的车站出发 由于有重兵把守,所以编号为1和n的车站不能被摧毁。当然那里没有一条路直接从1号车站连接到n号车站,请帮助Gabiluso计算他需要摧毁车站的最小数量,他 阅读全文
posted @ 2012-08-19 21:44 'wind 阅读(300) 评论(0) 推荐(0) 编辑
摘要: 题意: 求多边形重心。分析: 直接利用公式。#include<stdio.h>#include<string.h>#include<math.h>struct node{ double x,y;}q[1000005],cen;double mul(node a,node b,node c){ return (a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x);}int main(){ double s,a; int t,n,i; scanf("%d",&t); while(t--) { scanf(&qu 阅读全文
posted @ 2012-08-17 12:52 'wind 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出一个有N个顶点的多边形,问该多边形内是否存在一点满足在该点可以看到多边形内部任意一个位置。分析: 求多边形内核。#include<stdio.h>#include<string.h>#include<math.h>#define eps 1e-8#define maxn 105struct point{ double x,y;}p[maxn],q[maxn],s[maxn];int n,size,si;void init(){ int i; for(i=1;i<=n;i++) p[i]=s[i]; p[n+1]=p[1]; p[0]=p[. 阅读全文
posted @ 2012-08-16 21:56 'wind 阅读(255) 评论(0) 推荐(0) 编辑
摘要: 题意:有 N 个奶牛,奶牛A可能认为B 优秀,奶牛B可能认为C优秀,这种关系具有单向传递性,即在此情况下,奶牛A认为奶牛C也是优秀的,但奶牛B不一定认为A优秀, 问可以找出有多少个奶牛可以被其他所有奶牛都认为是优秀的。分析:如果奶牛A认为奶牛B优秀,就连一条从B到A的边,求出强连通分量并染色缩点,最后计算入度为0 的强连通分量是否只有一个,如果是则输出该强连通分量内点的 个数,否则就不存在满足条件的奶牛。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))#define min(a, 阅读全文
posted @ 2012-08-16 21:52 'wind 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出一个有N个节点的无向图和 M 条边,每条边都有一个重力承受度,要从中找出一条从 1 节点到 n节点的路径,使得可以经过的车辆载重最大。分析:类似于最大流中找增广路,在求最短路的松弛操作上加以修改。SPFA:View Code #include<stdio.h>#include<string.h>#define min(a,b)(a)<(b)?(a):(b)#define clr(x)memset(x,0,sizeof(x))#define INF 0x1f1f1f1fstruct node{ int to,next,w;}e[1000005];int 阅读全文
posted @ 2012-08-16 16:02 'wind 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 题意: 国王有 N 个王子,一共有 N个女子,知道了每个王子喜欢的女子,和一组互不冲突的男女匹配,问每个王子可以娶那些女子且不影响其他所有的王子都可以娶到 自己喜欢的女子。分析: 如果某个王子喜欢某个女子,就连一条从该王子到该女子的边,如果某个女子某个王子可以匹配,就连一条从该女子到该王子的边。 如果一些王子和一些女子的同一个强连通分量里,则这些王子可以娶该强连通分量里的任意的女子。#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;#define maxn 40 阅读全文
posted @ 2012-08-16 10:02 'wind 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 题意: 知道了N 个学校,以及每个学校提供软件支持的学校编号,一个学校得到软件支持之后便可以支持他能支持的学校,问至少对多少学校提供软件支持可以使得 所有学校都得到软件支持,和至少在这些学校添加多少条边能使得任何一个学校得到软件支持后,其他所有学校都能得到软件支持。分析: 先求出所有的强连通分量并进行染色缩点,找出入度为 0 的强连通分量,其个数即为使所有学校得到支持所需要提供软件支持的最小数量, 而根节点与叶子节点 数量中的最大值即为最少添加的边数。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0, 阅读全文
posted @ 2012-08-15 22:35 'wind 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 N个村庄,和 M 个区域,M个区域是由N个村庄之间的围墙分割而成,如:图中10个村庄间的围墙把地形分成了10 个区域,知道了一些人的所在的村庄的位置,想找一个区域,使得这些人到达这个区域经过的围墙数总和最小,并求出最小值。分析: 要把各个区域看成点,两两区域间的围墙看成边来建图,如果两块区域之间有围墙相隔,那么就在这两个区域之间建一条长度为1 的边, 图建完之后用 FLOYED 求出两两点的最短距离, 计算每个人到达某个区域的最小距离时,要枚举和该人所在村庄相邻的区域。 依次枚举目标区域找出最小值。#include<stdio.h>#include<string. 阅读全文
posted @ 2012-08-15 21:19 'wind 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 题意:有 M 个猪圈,每个猪圈里初始时有若干头猪,一开始所有猪圈都是关闭的,依次来了 N 个顾客,每个顾客分别会打开指定的几个猪圈,从中买若干头猪, 每个顾客分别都有他能够买的数量的上限,每个顾客走后,他打开的那些猪圈中的猪,都可以被任意地调换到其它开着的猪圈里,然后所有猪圈重新关上。分析:此题建图关键在于合并猪圈 建图: 对于每个猪圈的第一个顾客,从源点向他连一条边,容量就是该猪圈里的猪的初始数量 如果从源点到一名顾客有多条边,则可以把它们合并成一条,容量相加, 对于每个猪圈,假设有 n 个顾客打开过它,则对所有整数 i ∈ [1, n),从该猪圈的第 i 个顾客向第 i + 1 个顾客连一 阅读全文
posted @ 2012-08-15 13:34 'wind 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出一定的大写字母,并依次给出 m 个两两关系,如果在输入关系的过程中发现有环,或已经能确定所有序列的关系,则输出相应的结果,并且以后输入的关系 不会对当前结果产生影响。分析: 如果在输入过程每输入一个进行依次拓扑排序,如果排序中出现没有 0 入度的点则说明有环,如果每次找到的 入度为 0 的点均为一个,并且找到n 个,则顺序 可以被确定。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))int g[30][30];int d[30];int res[30];int n;i 阅读全文
posted @ 2012-08-15 09:22 'wind 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 题意: 已知有 N 个牛棚,且每个牛棚在一开始的时候有一定数量的牛,每个牛棚可以用来让牛避雨,但容量都有一定的限制,知道了一些牛棚之间的道路长度,问使得下雨时使所有牛都可以找到地方躲雨,且要使得所有牛中走过的路中的最大值尽可能小,并求出该最大值分析: 建图:将每个牛棚拆成两个点v,v` 建立一个源点 s =0 , 在 s 和每个点 i 之间连一条容量大小为该牛棚初始牛数量的边, 建立一个汇点 t =2*n+1 在 每个点 i+n 和 t 之间连一条容量大小为该牛棚容量的边。 如果点 u 和 v 满足条件,就在 u 和 v +n ,v 和 u+n之间连一条容量大小为 INF 的边。 如果最大流 阅读全文
posted @ 2012-08-14 17:10 'wind 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 题意: 一个三层书架,现要把一些高度和厚度不等的书放进书架,每层至少放一本,问书架面积最少是多少,且要保证书架是矩形的。 分析: 先对书按从高到低排序,不妨把最高的一本书放在第一层,这样第一层的高度就不用考虑了 dp[i][j] 表示第二层厚度为 i ,第三层厚度为 j 时第二和第三层书架高度和的最小值#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#define INF 601using namespace std;struct node{ int 阅读全文
posted @ 2012-08-14 14:41 'wind 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出一个A~Z的置换,问是否可以被表示为一个置换的平方(即G=G'*G')结论: 通过观察可以发现: 一个置换乘上它本身,其中长度为偶数的循环节必然会分裂为两个长度相等的循环节,长度为奇数的循环节还是一个循环节,长度不变 ○ 置换中长度为偶数的循环节必然是原置换中的循环节分裂出来的○ 长度为奇数的循环节有可能是原置换中的循环节分裂出来的 因为只要判断能否被表示,所以可以忽略长度为奇数的循环节,只对长度为偶数的循环节进行考虑即可。 因为一个长度为偶数的循环节分裂出来的两个循环节的长度相等且同为原循环节长度的一半, 所以,只要给出置换中所包含的长度为偶数的循环节能一一配对, 阅读全文
posted @ 2012-08-14 11:24 'wind 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 题意: 知道了一个序列a[1]..a[n] ,给出 m 个约束条件,① st sn gt ki 表示a[st]+a[st+1]+..a[st+sn]>ki ② st snlt ki表示a[st]+a[st+1]+..a[st+sn]<ki 问是否存在这样的 a[i] 序列。分析: 将上面的两个不等式等价转换建立差分约束系统 将 ① 变为s[st-1]-s[st+en] < -ki <=-ki-1 将 ② 变为s[st+en]-s[st-1] < ki <=ki-1 求解这个差分约束系统,看最后有无冲突// gt dis[s[i].en]-dis[s[i].s 阅读全文
posted @ 2012-08-14 10:26 'wind 阅读(215) 评论(0) 推荐(0) 编辑
摘要: 题意: 知道了数轴上的n个区间,每个区间都是连续的int区间,现在要在数轴上任意取一堆元素,构成一个元素集合V要求每个区间和元素集合V的交集至少有两个不同的元素 求集合V最小的元素个数。转一分析:(差分约束)设s[x] = 从0 到x 的所有在集合中的数的个数则ai到bi的个数即S[bi] - S[ai-1]。因此有(1) S[bi] - S[ai-1] >= 2。又根据s[x]本身的性质,后面的一定不比前面的小,后面的最多比前面多一,有:(2) s[i + 1] - s[i] >= 0 (3) s[i + 1] - s[i] <= 1故建图,使图中每一组边,均满足(注意三条 阅读全文
posted @ 2012-08-13 23:01 'wind 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 题意: 给出一个 n*n的数字矩阵,从左上角走到右下角每次只能向下或向右走,且每个格子中的数字只能取一次,问走k次之后可以取到的最大的数值和为多少。分析: 比较经典的网络流解DP的题目,可以用费用流求解, 建图: 将每个割格点拆分成两个点 v(入点),v`(出点),在v 和v`之间先连一条容量为 1 ,费用为格子数值的边,再连一条容量为无穷大费用为0的边, 这样既可以保证每个数只被取一次,又能保证可以多次经过这个数所在的格子 建立源点 s = 0,在 s 和 最左上角的格子的入点之间连一条容量为 K,费用为0 的边 建立汇点 t = n*n*2+1,在 t 和最右下角的格子的出点之间连一条容量 阅读全文
posted @ 2012-08-13 15:13 'wind 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 题意: 已知有n个插头,知道了m个用电器和其能插的插座型号,和k个转换器,问最少有多少个用电器无法连接到相应的插座上。适配器的作用: 例如:有插座C 转换器B(插孔) C(插头) 如果用电器能插到插座B上,那么通过转换器,它就能插到C上。分析: 建图的时候递归建图,如果用电器能直接连到某个插座或通过转换器间接查到某个插座上,就在期间连一条边,求出最大匹配,用总数减去即为剩下的无法连接个数的最小值#include<cstdio>#include<cstring>#include<string>#include<map>#include<ios 阅读全文
posted @ 2012-08-13 11:57 'wind 阅读(351) 评论(0) 推荐(0) 编辑
摘要: 题意: 年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格。探险家于是又跑到其他地方,其他人也提出了类似的要求,或者直接用金币换,或者找到其他东西就可以降低价格。不过探险家没必要用多样东西去换一样东西,因为不会得到更 阅读全文
posted @ 2012-08-13 09:06 'wind 阅读(196) 评论(0) 推荐(0) 编辑
摘要: 题意: 知道了一些出租车任务的时间,每个任务需要一辆出租车从该任务的起点到终点,有些任务有时间上的冲突,问最少需要多少 辆出租车能完成任务。分析: 最小路径覆盖。 如果两个任务没有冲突,就在两个任务之间连一条边,找出最少的路径条数来覆盖所有点,(一条路径只需要一辆车)。 最小路径覆盖 = 总权 - 最大匹配#include<stdio.h>#include<string.h>struct node{ int to,next;}e[1000000];int tot;int head[505];void add(int s,int u){ e[tot].to=u; e[to 阅读全文
posted @ 2012-08-12 23:19 'wind 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 题意: 已知一个有 N 个节点 M 条边的无向图,问最短路和比最短路长度大1 的次短路共有多少条。分析: 在原来的dijkstra()上加一点变动,d[i][0]记录最短路的长度,d[i][1]记录次短路的长度,dp[i][0] 到达当前点最短路的条数,dp[i][1]到达当前点次短路的条数。View Code /************************************************************************************ 采用dijstra算法的思想,每次从dis[N][2]中选择一个未被标记且值最小的点dis[v][p] (可能.. 阅读全文
posted @ 2012-08-12 10:50 'wind 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 题意: 有一个有 N 个节点M 条边的的有向图,每个点对应两种操作: 将该点所有入边删除 ‘+’ ,对应一个花费,将该点所有出边删除 ‘ - ’亦对应一个花费 问如何操作将所有边删除使得花费的总和最小。分析: 建图: 将每个点拆分成两个点, i(左点) 和 i+n(右点) , 建立一个源点 s=0,汇点 u=2*n+1在源点和每个点左面的点连一条边,容量为删除出边的费用 在汇点和每个点右面的点连一条边,容量为删除入边的费用如果有 u到 v 的边,在u 和 v +n 之间连一条边,容量为无穷大 求出最大流即最小割 从源点深搜找出残流不为 0 的点,把这些点标记掉,剩下的为标记的点即为删除的顶点。 阅读全文
posted @ 2012-08-11 19:05 'wind 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 题意: 有一个有 N 个节点的无向图,要求找出两条从1 节点 到 n 节点两条最短且不同的路径,求出其长度和。分析: 由于是两条不同的路径,可以用最小费用最大流,因为是有重边,所以要用邻接表存储边。 建图:建立一个源点 s = 0 在 s 和 1 节点之间加一条容量为 2 费用为 0 的边, 建立一个汇点 u = n+1 在 n 和 u 之间加一条容量为 2 费用为 0 的边, 两两节点如果连通,就在之间加一条 容量为 1,费用为边的长度的双向边。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,si 阅读全文
posted @ 2012-08-11 12:38 'wind 阅读(238) 评论(0) 推荐(0) 编辑
摘要: 题意: 有 N 头牛位于N个地点,知道了M 条边,这些牛现在要去 x 号牛那里聚会,问这些牛从自己的地点出发到 x 点,再回到自己的地点的所有最短路径中最长的一条,而且来的时候的路和回去的路不能相同,(因为边是单向的,肯定不同)。分析: 题意即将每头牛到 x 点的最短距离和该牛回来的最短距离相加,找出其中的最大距离。 如果以每个点为起点 ,以 x 为终点 求最短路,再加上以 x 为起点以每个牛的地点为终点的距离的话,容易超时, 可以在先求出 以 x 点为起点以各个点为终点的最小距离之后,将原图的边反转,这样以 x 为起点以其他各个点为终点的最短距离,即为以每个点为起点以 x 为终点的 的最短距 阅读全文
posted @ 2012-08-10 20:22 'wind 阅读(143) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 9 ··· 17 下一页