算法
huyifan1
这个作者很懒,什么都没留下…
展开
-
LeetCode 135. 分发糖果
LeetCode 135. 分发糖果解题思路和代码我们可以举一个比样例稍微好一点的例子[7,8,4,2,1,3,5,9,7] 。首先可以想到第一种思路:我们先定义一个数组candies,这个数组存放着每个人最终获得的糖果。接着我们找到数组的最小值及其下标定义为sym。如果是第一次遍历,则直接令candies[sym]=1,因为每一位小朋友至少要有一个糖果。在例子中这个最小值是1,sym...原创 2019-02-13 18:32:13 · 252 阅读 · 0 评论 -
csu1120 最长上升公共子序列
题目大意:中文题。算法思路:最长上升公共子序列。#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define MAXN 1050int a[MAXN],b[MAXN];int n,m;int dp[MAXN];int main...2016-09-07 22:55:46 · 144 阅读 · 0 评论 -
CSU1506 最小费用最大流
题目大意:给你一张图,一个人走过之后路径的费用会增加,问有2个人走,最小的总费用是多少。算法思路:一开始准备跑2遍dijkstra,每次求最小的费用,不知道为什么这样一直WA,最后问了一下别人,发现是用最小费用最大流,每个点之间连接2条边,一条是走之前正常的路,另一条是走完这条路后增加了费用的路,因为有2个人,因此超级源点与起点的容量为2,超级汇点与终点的容量为2,跑一遍最小费用最大流的模...2016-08-23 21:39:04 · 85 阅读 · 0 评论 -
POJ3660 floyd求传递闭包
题目大意:一群牛比胜负,然后balabala,然后给你一堆关系,让你求出能够判断出名次的牛的个数。算法思路:这道题主要的用的是传递闭包,然后只要判断该牛的入度和出度之和等于n-1,就说明该牛能判断出名次。#include <iostream>#include<cstdio>#include<cstring>#include<queue...2016-08-19 10:03:09 · 103 阅读 · 0 评论 -
NYOJ239 月老的难题 二分图匹配
题目大意:中文题。算法思路:匈牙利算法的模板题,一开始用邻接矩阵做,结果超时了,后来一看,有10000的边数,难怪超时,因为要判定两点是否有边的话,就得遍历一行,每次递归都这样做的话时间花费是很大的,就改为了邻接表,过了。#include <iostream>#include<cstdio>#include<cstring>#includ...2016-08-18 10:20:09 · 119 阅读 · 0 评论 -
NYOJ 哭泣天使 sap求最大流
题目大意:中文题。算法思路:因为他是网格,所以我们把将每一行看成点,将每一列看成点,将行与超级源点连接,行再与列相连接,列再与超级会点相连,求最大流即可。#include<bits/stdc++.h>using namespace std;#define INF 0xfffffff#define MAXN 600int t;int m,n,sum1,sum...2016-08-18 09:44:45 · 156 阅读 · 0 评论 -
NYOJ118 求次小生成树
题目大意:中文题。算法思路:求次小生成树。#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define INF 0x3f3f3f3f#define MAXN 505int t,n,m,a,b,c,sum,e,MAX,pr;int...2016-08-17 15:30:09 · 111 阅读 · 0 评论 -
Poj3177 tarjan算法求双连通分量
题目大意:给定一个无向连通图,问天几条边可以使它变成一个双连通图。算法思路:tarjan算法模板。#include<iostream>#include<cstdio>#include<cstring>#include<stack>using namespace std;#define MAXN 10005int n...2016-08-16 10:28:39 · 262 阅读 · 0 评论 -
NYOJ677 EK算法求解最大流
题目大意:中文题。。。算法思路:这里明显是求最小割的。那么什么是最小割呢?最小割就是所有割的权值之和的最小值,那么什么是割呢?割就是如果把图中的一条边或几条边去掉之后使得图变得不连通。这里可以用一个叫做最大流最小割的定理:在任意一个只有一个源和一个汇的图来说,最小割就等于最大流。因此可以把问题转化为求最大流的问题。这里用ek算法求解最大流。#include<iostream>...2016-08-15 16:34:11 · 88 阅读 · 0 评论 -
HDU 4435
题目大意:有一个国王他开着一辆最大只能行驶d距离的车子(因为行驶完d距离后车子就没油了)环游世界,他想从1点出发环游到n点再回来,由于车子的原因,他必须在某几个点上建加油站,来保证它能够顺利的环游世界,但是在第i个点建立加油站的费用为2^i,因此问你如何建站能使所需要的费用最小,如果怎么建站也不行的话就输出-1。算法思想:假设我们再每个点都建站,如果这样都不能完成的话,那么肯定输出-1,否...2016-08-13 12:01:33 · 103 阅读 · 0 评论 -
Poj1523 无向连通图求割点
题目大意:也是给你一个无向连通图,让你求出该无向图的割点,并求出如果去掉这个割点,该无向图会变成几个连通分量。算法思路:赤裸裸的tarjan求割点算法,但cnt数组记录的是去掉该点,连通图的连通分量的变化量,因此,如果数组在该点的值不为1,那么说明这个点为割点,但要注意,分成的连通分量数为cnt数组在该点的值+1。但特别要注意的一点,如果根节点是割点的话,那么说明根的度>=2,则这个...2016-08-12 09:53:08 · 215 阅读 · 0 评论 -
Poj1144 tarjan算法求割点
题目大意:给你一个节点从1到n的连通图,问你这个图的割点有多少个。算法思路:求割点的简单题,求割点也用tarjan算法,但要注意,根如果为割点的话,那么根的度必须大于等于2,其他点判定割点的话当且仅当自己的子节点没有越过自己的回边,也就是low[v]>=dfn[u].#include<iostream>#include<cstdio>#includ...2016-08-11 21:14:12 · 133 阅读 · 0 评论 -
hdu5443 线段树求区间最大
题目大意:给你一些水源,让你求给定区间当中的最大值。算法思想:线段树求区间最大。#include<iostream>#include<cstdio>using namespace std;typedef struct Node{ int value; int l; int r;};Node tree[1...2016-09-13 19:30:19 · 112 阅读 · 0 评论 -
hdu5446 中国剩余定理+lucas定理
题目大意:让你求出C(n,m)%M的值。算法思路:此题的 n和m非常大,因此不能用快速幂取模,这里我们只能用lucas定理,但lucas定理有一个条件,要求C(n,m)%M的M必须要为素数,因此,我们又要用到中国剩余定理。#include<iostream>#include<cstdio>#include<cstring>using nam...2016-09-16 16:35:34 · 164 阅读 · 0 评论 -
hdu5532 最长不上升子序列+最长不下降子序列
题目大意:让你求出这个串是否是近似有序串,什么叫做近似有序串呢,就是,这个串去掉任意一个字符也能保持有序。算法思路:模板题,只需要求出最大的有序子串,然后看这个串总的长度-1是否小于等于最大有序子串的长度,如果不满足,则说明这个串不是近似串。如何求最大有序子串呢,就比较一下最长不上升子序列的长度和最长不下降子序列的长度,取最长的即可。#include<iostream>#...2016-10-14 11:37:04 · 207 阅读 · 0 评论 -
nyoj236 偏序集+dilworth定理的应用
题目大意:中文题。算法思路:这道题可以通过dilworth定理,将原序列排序后,转化为求有多少个单调递增子序列(即求最大递减子序列的长度)。但是当我直接求单调递增子序列的个数的时候就过了,但转化为求最大递减子序列的长度的时候就超时了= =,实在是莫名其妙。。还是请各位大神帮我看看。。。 先看一下什么是偏序集,以及dilworth定理(以下内容转载自http://blog.csdn....2016-10-06 14:49:09 · 233 阅读 · 0 评论 -
nyoj306 dfs+二分搜索
题目大意:中文题。算法思路:这种思路确实对我来说很新颖,我也是看了解题报告才知道。说白了,二分最小值和最大值的差,如果这个差值能够从起点走到终点,则说明这个差值是可行的,那我们就在减小,二分左半部分,否则二分右半部分。 #include<iostream>#include<cstring>#include<cstdio>using na...2016-10-05 10:15:31 · 160 阅读 · 0 评论 -
nyoj132最长回文子串
题目大意:中文题。算法思路:假设每个字符都是回文串的中间字符,则每个字符都向两边扩展,取能够扩展最宽的,则必定是最长的回文子串。因此暴力枚举每个点即可,注意一下这个串可能是奇数也可能是偶数,因此对于每个字符,这两种扩展都要算一下,比较一下哪个是最长的。 #include<iostream>#include<cstring>#include<cst...2016-10-04 16:17:17 · 107 阅读 · 0 评论 -
NYOJ104 最大子矩阵和
题目大意:中文题。算法思路:暴力枚举起始行,然后再对每一列使用最大子段和(二维转化为一维)。#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define MAXN 105#define INF 0x3f3f3f3fint t,MAX,...2016-10-04 16:11:49 · 124 阅读 · 0 评论 -
hihocoder 1156
题目大意:中文题。算法思路:因为改变一个节点的颜色,只会影响到这个节点的父节点和子节点,所以,我们只需要在一开始建立好节点之间的关系maps[i][j](maps[i][j]表示第i个节点的子节点里颜色为j的节点个数),之后再没改变一个节点的颜色,就对该节点的父节点和和子节点进行操作即可。#include<iostream>#include<cstdio>...2016-10-02 12:35:48 · 162 阅读 · 0 评论 -
hihocoder1158 二分图的最大独立集
题目大意:中文题。算法思路:首先找出每个数的质因数的个数,因为如果a和b是质数相关的话,那他们两个的质数的个数肯定是一奇,一偶,因此我们可以根据这个性质,将这些数分成两个部分,转化二分图的最大独立集求解,这道题我已开始用求解质因数的模板,结果发现这个模板对于相同的质因数只算一个(在这里wa了好多回=- =),后来只好打素数表求解。。。#include<iostream>#...2016-09-29 21:10:48 · 121 阅读 · 0 评论 -
hihocoder1388 NTT算法
题目大意:就是让你求出满足所给式子的值是多少。算法思路:其实我们可以将这个式子化简一下,化简成为sum(a[i]*a[i] ,i=0....n-1)+sum(b[i]*b[i] ,i=0...n-1)-2*max(sum(a[i]*b[j]),i=0...n-1,j=0...n-1)。#include <iostream>#include<cstring>...2016-09-28 20:04:46 · 135 阅读 · 0 评论 -
2016北京网赛Countires
题目大意:两个城市A,B分别有两个护盾,现已知B护盾开启的时间和持续的时间,两个城市互相射击炮弹,如果打到的城市有护盾则反弹给另一个。现在问你要使得A城市最小受到的伤害是多少?算法思路:我们只需要算出每颗炮弹给A造成的伤害区间,将其转化为区间交问题,即可。#include<iostream>#include<cstring>#include<cstdio...原创 2016-09-25 15:44:07 · 170 阅读 · 0 评论 -
hdu5901 Meisell-Lehmer算法求素数个数
题目大意:让你求1-n里面有几个素数(1<=n&&n<=1e11)。算法思路:这里的n非常大,因此我们用Meisell-Lehmer算法求1-n的个数,该算法的复杂度为n^(2/3)#include<cstdio>#include<cmath>using namespace std;#define LL long long...2016-09-19 11:02:27 · 208 阅读 · 0 评论 -
hdu5444 模拟
题目大意:给你一棵树的先序遍历和中序遍历,让你求给定点的位置。算法思路:根据中序遍历和先序遍历的特点,模拟即可(这模拟模了我快三小时,我也是醉了)。#include<iostream>#include<cstdio>#include<cstring>#include<string>using namespace std;...2016-09-16 20:45:51 · 114 阅读 · 0 评论 -
POj2762 tarjan算法求强连通分量
题目大意:有n个房间,这些房间都有给定的路,现在要求任意两个房间能否相同(假设a与b相连通,那么只要满足a与b能够连通或者b与a能够连通即可)。,如果任意的两点能够连通输出Yes,否则输出No.算法思路:明显的求强连通分量,再缩点,再对缩点后的图判断连通性(这里采用拓扑排序判断连通性,如果有2个及以上的点入度为0的点出现的话,说明缩点后的图是不连通的)。#include<iost...2016-08-11 17:04:20 · 116 阅读 · 0 评论 -
HDU4430
题目大意:k^0+k^1+k^2+...+K^r=n,给你n让你求k和r,若有多组k和r取乘积最小的,若最小的乘积相同,取r值最小的(这里注意,蛋糕的中心可以不放蜡烛,因此k^0可以省略,所以判断的时候不要忘记)。算法思路:有等比数列公式可得,当k取最小的2时,r最大不超过40,因为超过40,n就要超过12位了。那么只需要遍历r,然后对k在[2,pow(n,1/r)]区间内进行二分,求出答案...2016-08-11 09:13:55 · 180 阅读 · 0 评论 -
Poj1286 tarjan算法求强连通图
题目大意:问给你n头牛和m个牛与牛之间的关系,问你有多少头年能够被所有的牛所知道,当然两头牛通过第三方的牛有连接也算认识。(注意A认识B但B不一定认识A,所以是个有向图).算法思路:就是求强连通图,因为A与B如果要认识,则A肯定有变直接或间接到B,同理B也必须满足这样的条件,因此这道题我们可以用tarjan算法求出图中有几个强连通分量。稍微想一想我们就可以发现,如果强连通分量X与强连通分量...2016-08-10 11:09:28 · 85 阅读 · 0 评论 -
HDU 1572
题目大意就不用说了吧没因为是中文题。。。算法思路:这里要注意,他这里只把乘客所要下的站点作为他路线上的站点,因此,我们可以直接深搜即可。#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define INF 0x3f3f3f3fbool p...2016-08-05 10:45:23 · 66 阅读 · 0 评论 -
基础算法——深度优先搜索
深搜这个算法相信大家肯定都不陌生吧,它是算法中基础中的基础,它运用到的就是递归了,它还隐式的包含了一种数据结构——栈,我在理解这个算法的时候可吃了不少苦头,花了不少时间,但是一旦掌握,你的思维可以说会提升一个档次,下面让我们一起来看看什么是深搜算法。算法例题:要说涉及到深搜的问题,不得不说一个名字——n皇后问题,其中n皇后问题中最出名的就是把皇后了,下面我们看看这题目是怎么样的。在n...2016-08-04 13:31:12 · 175 阅读 · 0 评论 -
Poj2679 spfa算法深度应用
题目大意:给你村庄和村庄之间的距离和费用,如果这个村庄的费用可以无限小就输出UNBOUND,如果这两个村庄之间没有路就输出VOID,否则则输出在满足最小费用下的最短路。算法思路:判断村庄费用无限小其实就是判断在所给的两个村庄a,b之间是否存在负环,注意全图存在负环但这两个村庄之间不存在负环的情况要考虑啊!因此我们要判断一下如果存在任意一个入队次数>n的点与b连通,或者本身b的入队次数就...2016-08-04 11:49:31 · 213 阅读 · 0 评论 -
Poj3268 spfa算法应用
题目大意:来自n个农场的n头牛去一个给定的x农场吃草,来回都走最短路,这几个牛所走过的最大的路是多少。算法思想:spfa的应用,对每头牛去的时候搞一次spfa,回来的时候在搞一次spfa,再将这两段距离之和相加。最后在维护一下最大值输出即可。如果不大清楚spfa算法,可以参考下http://huyifan951124.iteye.com/blog/2315252#include&l...原创 2016-08-04 08:19:09 · 107 阅读 · 0 评论 -
POj3259
题目大意:有n个村庄,村庄之间有m条正常的路,有w条时光隧道,隧道的权值为负数即时空倒流,问你他能否回到起始点看到自己。算法思想:只要从任意一点出发,看这个点出发是否有负环,并且这个负环是回到起始点的。#include<iostream>#include<cstdio>#include<cstring>#include<queue&...原创 2016-08-04 08:16:26 · 98 阅读 · 0 评论 -
Poj2387 spfa算法初识
题目大意十分简单,就是给你m条边的距离,让你求从1到n的最短路径.解题思路:这是我第一次用spfa算法解题,学习spfa算法的心得都在代码注释里,若理解不对还请大牛们指出,谢谢啦。#include<iostream>#include<cstdio>#include<cstring>#include<queue>using ...2016-08-03 15:47:04 · 105 阅读 · 0 评论 -
Poj2570 Fiber Network
题目大意:现给出每条边的供应商,让你求若要使某两个点连通所需要的供应商有哪些。算法思想:赤裸裸的floyd算法再加上位运算优化,如何为运算呢,假设1-2的的供应商为abc那就表示为00000000000000000000000111,2-3的供应商为ad,那就表示为00000000000000000000001001。因为有26个字母,所以表示为26位。这样表示完了之后在floyd算法里就只...2016-08-03 09:32:08 · 94 阅读 · 0 评论 -
Poj2263 Heavy Cargo
题目大意:给出每个城市之间的距离,让你求卡车能通过的边中的最大载重量。算法思路:在所有的通路中求最小边长的最大值(类似于poj2253)http://huyifan951124.iteye.com/blog/2314976。由于点的个数比较小,又是对给定的任意两个点求值,因此我们可以用floyd算法,当然也可以使用网络流。#include<iostream>#inclu...原创 2016-08-03 08:28:42 · 97 阅读 · 0 评论 -
最小生成树专题
poj2421,poj2560,poj1789这些都是一些比较基础的最小生成树的题目,在这里我分别用两种方法来实现--kruskal以及prim(其中prim是建哥写的,kruskal是我写的).//poj2421 kruskal#include <iostream>#include<cstdio>#include<algorithm>...2016-08-02 15:01:35 · 75 阅读 · 0 评论 -
Poj2253 dijkstra最短路变形
题意:求1点到2点的所有能够到2点的所有通路里的的最大路径(这里的路径特指两点之间的线段)的最小值。这题对我来说收获颇丰,我们可以修改dijkstra里面的松弛函数,使得其变为求每个点的满足条件的值,并用dist数组来记录。详见代码。#include<iostream>#include<cstdio>#include<cstring>#in...2016-08-02 14:46:53 · 194 阅读 · 0 评论 -
NYOJ士兵杀敌2(线段树的单点更新,区间查询)
初学线段树--单点更新,区间查询算法思路:运用递归,建完树之后,再通过递归,找到树节点的左区间端点==右区间端点&&等于你要查询的那个下标,然后更新其值,就完成了单点更新,最后区间查询时注意区间横跨树的两个节点的情况。下面上代码: #include<iostream>#include<cstdio>using namespac...原创 2016-08-01 21:39:50 · 104 阅读 · 0 评论 -
hdu2962 最短路
题目大意:就是给定起始点和结束点以及卡车的重量,问你在保证卡车重量最大的前提下,最短路径是多少,我们可以枚举卡车的重量,在对每个卡车的重量进行dijkstra,算到终点是否存在最短路径。当然枚举也可以用二分进行优化,时间差的还是蛮多的。 2016-08-05 15:23:00Accepted29629297MS9500K...2016-08-05 15:41:25 · 75 阅读 · 0 评论