自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

慕枫幕影的专栏

菜鸟一枚,若有错误,请各位大神指出

  • 博客(74)
  • 收藏
  • 关注

原创 HDU1069(最长单调递减数列)

告诉你n种规模的长方体的长,宽,高,每种规模的长方体个数不限,问你最多能搭多高的塔,塔是由这些长方体搭的,自上而下,每一块长方体都要比在它下面的长方体的规模小,即长和宽都比下面的长方体要小。注意长方体是可以调整的。我们用dp[i]来表示搭建到第i块长方体的时候塔的最高高度,那么状态转移方程就是dp[i]=max(dp[i],dp[j]+s[i].h);#include #include

2014-05-07 19:44:17 1149

原创 HDU1116(欧拉回路+并查集)

先用并查集来判断图是否连通,然后再根据欧拉回路的出度和入度的性质来判断是否为欧拉回路。关键是建边,我们可以把字符串看成是一条边,首字母为出发点,尾字母为目的点,建边。#include #include #include #include #include #include #include #include #include #include #include #de

2014-05-05 22:05:11 934

原创 HDU2647(拓扑排序+反向建图)

题意不说了,说下思路。给出的关系是a要求的工资要比b的工资多,由于尽可能的让老板少付钱,那么a的工资就是b的工资+1,可以确定关系为a>b,根据拓扑排序建边的原则是把“小于”关系看成有向边,那么我们可以建边v->u。#include #include #include #include #include #include #include #include #inclu

2014-05-03 10:35:32 1568

原创 HDU3715(二分+2-SAT)

题意就是求满足题目中给出的递归代码的最大递归层数。由于x[i]只有0和1,所以我们就比较容易想到2-SAT,然后二分递归层数,求出满足要求的最大递归层数。建图的时候,不满足不等式的就是互相矛盾的,然后建边。#include #include #include #include #include #include #include #include #include #in

2014-05-02 09:53:12 1081

原创 HDU3622(二分+2-SAT)

题意不说了,直接讲思路。首先对半径进行二分,然后再判断炸弹之间的距离是否小于2*半径,如果是,那么就连接i->j^1和j->i^1,然后用强连通判断可行性。#include #include #include #include #include #include #include #include #include #include #include #define

2014-05-01 20:57:25 1368

原创 HDU1824

2-SAT入门题,将两个队员看成一个点即可,即用一条边将两个队员连起来,然后就是2-SAT裸题。#include #include #include #include #include #include #include #include #include #include #include #define M 3005#define LL long long#def

2014-05-01 19:39:33 964

原创 HDU3861(强连通+最小覆盖路径)

题意:国王要给n个城市进行规划,分成若干个州。如果:1、有边u到v以及有边v到u,则u,v必须划分到同一个州内。2、一个州内的两点至少要有一方能到达另一方。3、一个点只能划分到一个州内。思路:先把能相互两两到达的点用强连通归为一个州,然后再进行缩点,建立新图,然后用匈牙利算法求出最大匹配,答案=强连通求出的联通块-最大匹配(最小路径覆盖=结点数-最大匹配)。#include #inclu

2014-04-19 10:11:40 1496

原创 HDU2444(最大匹配)

题意:有n个人,和m种关系,代表a和b认识。要求将n个人放入到两个集合中,每个集合中的人互不认识,A集合中的人找B集合的人住房间,两个人一间,且两个人必须认识,问你最多能住多少间房间。思路:先确定A、B集合中各有哪些人,我们可以用个数组表示每个人在哪个集合中,若有重复,则输出No,反之再找最大匹配。#include #include #include #include #inclu

2014-04-17 20:04:37 1265

原创 HDU1845(最大匹配)

两个点集,个数都为n,求出最大匹配,然后除以2#include #include #include #include #include #include #define maxn 5005#define LL long longusing namespace std;int n;vector G[maxn];int lx[maxn],ly[maxn];bool vis

2014-04-15 21:07:33 838

原创 HDU1528(最大二分匹配)

题意:k表示有k张牌,然后第一行是Adam的牌,第二行是Eve的牌,每两个字符代表一张牌,第一个字符表示牌的点数,第二个表示牌的花色。Adam和Eve每次从自己的牌中选出一张牌进行比较,谁的牌大,谁就加一分,问你Eve最多能得到多少分。思路:最大二分匹配,Eve的牌为集合1,Adam的牌为集合2,集合1中的牌与集合2中比它小的牌建立联系,找最大匹配。#include #include

2014-04-09 16:12:18 927

原创 HDU1507(最大二分匹配)

题意:给你一个n*m的地,然后给你p个点,表示这些点代表的地是不能卖的,问你最多能卖出多少块1*2的地。找出i+j为奇数的且能卖的地,作为集合1,与这块地相邻的且能卖的地为集合2,这就转化为最大二分匹配了。#include #include #include #include #include #include #include #include #include #de

2014-04-08 20:38:14 1279

原创 HDU1281(最大二分匹配+枚举)

求能放最多的车,就是求最大二分匹配。判断是不是重要点,只需把出去这个点,走一遍最大匹配,看结果是不是一样,如果一样,则不是重要点,然后枚举每个点即可。#include #include #include #include #include #include #include #include #include #define LL long long#define maxn

2014-04-07 19:19:53 870

原创 HDU1179(二分匹配(匈牙利算法))

题意为:有n个人要去买魔杖,有m根魔杖(和哈利波特去买魔杖的时候一样,是由魔杖选人)。接下来是m行,每行第一个数k是第i根魔杖可以选的人数,接着k个数表示这根魔杖选的人的编号。最后问老板最多能卖出多少根魔杖。这个赤裸裸的模版题,套下就OK了。#include #include #include #include #include #include #include #includ

2014-04-07 18:19:23 1390

原创 HDU2433(SPFA)

刚开始用dijkstra()+暴力枚举,然后就超时了。后来看了题解才知道这题的关键所在:用sum[i]来存以i为起点的最短路之和,ans表示i从1到n的sum[i]的和,然后摧毁道路之后,以u为起点,看能不能到达v,如果能到达,同时也就说明了以v为起点也能到达u,因为路是双向的,则以u,v为起点,保存它们的最短路之和,答案就是ans-sum[u]-sum[v]+num1+num2;若不能到达,则直

2014-03-31 19:08:56 804

原创 HDU1595(枚举+最短路(dijkstra))

题意不多说了。。思路就是先走一遍dijkstra,然后p数组记录下路径,然后枚举路径上的边删去之后走dijkstra得到的最短路(想想为什么?我当时做的时候是枚举了图每条边,然后就超时),取最大值。#include #include #include #include #include #include #define maxn 1005#define INF 99999

2014-03-24 21:49:03 1672

原创 HDU1217(bellman_ford判环)

用bellman_ford来判环,就是对所有边进行n-1次松弛,之后若还能进行松弛,则存在环。#include #include #include #include #include #include #define maxn 1005using namespace std;struct Edge{ int from,to; double rate;}edge[max

2014-03-22 09:20:46 1053

原创 POJ2777(线段树区间更新+LAZY)

涂色问题,题意我就不说了。#include #include #include #include #include #include #define LL long long#define maxn 200005using namespace std;struct Node{ int color; int left,right;};struct Node node

2014-03-15 10:50:37 986

原创 poj2828(线段树单点更新)

题意不说了。思路是将人倒叙插入,线段树各个区间的值代表前面有多少个空位。#include #include #include #include #include #include #include #include #include #include #define LL __int64 using namespace std;

2014-03-13 22:07:19 975

原创 HDU1698(线段树区间更新求和)

题意是给你n长度的钩子,每单位的初始值为1,然后m个操作,将(l,r)之间的值变为v,求最后n长度的值的和。#include #include #include #include #include #include #include #include #include #include #define LL __int64using namespace std;con

2014-03-13 19:03:29 1035

原创 HDU2795

题意是给你一个h*w的广告板,然后有n张1*wi的广告要贴上去,要求尽可能的左,相同的情况下尽可能靠上。我们可以按照层数来建立线段树,然后每一部分记录最大的w值。#include #include #include #include #include #include #include #include #define LL(x) (x<<1)#define RR(x)

2014-03-11 23:48:37 655

原创 POJ2135(最小费用最大流)

建立一个超级源点到1这个点的容量为2,费用为0,超级汇点同理,模版题。#include #include #include #include #include #include #include using namespace std;const int maxn=1005*1005*2;const int INF=999999999;struct Edge{ in

2014-02-22 10:07:54 1036

原创 HDU4289(最大流)(dinic算法+拆点)

将每个城市拆成两个点,他们之间的流量就是这个城市的值,不同城市之间的流量是无穷,这样走一遍最大流就可以了。#include #include #include #include #include #include #include using namespace std;const int maxn=100005;const int INF=999999999;stru

2014-02-14 19:04:24 1074

原创 POJ3281--Dining(最大流)

主要是构图。刚开始我想的是源点->牛->食物->饮料,发现问题很多,正确的构图应该是源点->食物->牛->牛->饮料->汇点,中间牛与牛之间的容量为1。#include#include#include#include#include#include#include#include#include#include#include#includeusing namesp

2014-02-11 20:47:51 790

原创 POJ1274--The Perfect Stall(最大流)

这题可以用网络流做,也可以用二分匹配做。我用的是网络流,其中结点的总数是(n+m+2)(其中两个是超级源点和超级汇点)个。构图的话从超级源点到每头牛的容量为1,每头牛到它喜欢的谷仓的容量为1,各个谷仓到超级汇点的容量为1。#include#include#include#include#include#include#include#include#include#inc

2014-02-11 18:13:38 1193

原创 POJ1459--Power Network(最大流)

最大流模版题。多源点多汇点,只需再添加两个点,将其中一个点与各个源点连接,并将其最为源点,汇点同理。#include #include #include #include #include #include #include using namespace std;const int maxn=205*205;const int INF=999999999;struct

2014-02-10 18:05:39 1009

原创 HDU3339--In Action(最短路+0-1背包)

先用最短路求出0到i点的最短距离,然后再用0-1背包做。#include #include #include #include #include #define INF 999999999#define M 105using namespace std;int main(){ int map[M][M],p[M],dp[M*M]; int n,m,t,i,j,k,sum

2014-01-25 20:43:08 882

原创 HDU3342--Legal or Not(强连通)

我们可以先求出强连通分量,然后用num数组记录每个强连通分量里面的顶点数,若有强连通分量里的顶点数超过1,就输出NO,否则就输出YES。#include #include #include #include #include #include #include #include #include #define INF 999999999#define M 105#def

2014-01-25 18:48:24 900

原创 ZOJ3232--It's not Floyd Algorithm(强连通+缩点+建图+floyd)

题目是给你一个矩阵,1表示u可以到达v,0代表不可到达,问你至少需要多少条边组成的传递闭包符合这个矩阵。我们可以求出强连通分量,然后在对每个强连通分量进行缩点,每个强连通分量的最少边的数量就是该强连通分量的结点数,再建立新图。对新图中的点用floyd算法,若图中用floyd算法能达到的,且在新图中为1的点,我们将它变为0,则答案就是每个强连通分量内的边数加上新图中为0的点的个数。#incl

2014-01-24 18:53:51 1280

原创 HDU3639--Hawk-and-Chicken(强连通+缩点+反向图)

这题WA了好几遍。原因是num数组没有初始化。。果然细节很重要啊。。题目意思是求传递数最大的有多少孩子,并输出他们的序号。我们先在原图上用Tarjan算法求出强连通分量,然后建立反向图,并求出反向图中各个点的入度,传递数的最大值肯定是在这些入度为0的点中。#include #include #include #include #include #include #include

2014-01-23 15:20:43 1243

原创 HDU3836--Equivalent Sets(强连通+缩点)

题目就是告诉你有m条边是从u通向v的,问你至少添加多少条边之后,能形成一个强连通。模版题。#include #include #include #include #include #include #include #define LL long long#define M 20005using namespace std;vector G[M];int dfn[M],

2014-01-23 09:01:05 805

原创 POJ1236--Network of Schools(强连通+缩点)

第一问:至少需要多少份软件,才能使得所有学校都能拥有软件;第二问:如果只用一份软件,那么需要添加多少条变,使得所有学校都能拥有软件。第一问中,如果一个学校有用一份软件,那么它的强连通分量中的其他学校,肯定也能够拥有软件,所以只要求出出度为0的强连通分量的个数即可。第二问中,就是求需要添加多少条变,使得整个图都成为一个强连通,即任意两个学校都可到达,所以我们只要求出出度为0的个数a,和入度为

2014-01-22 15:04:47 792

原创 POJ2186----Popular Cows(强连通+缩点)

刚看的白书上的强连通,有种似懂非懂的感觉,所以就拿题目来练练手。此题题意不说了。我们在求出强连通分量之后,答案就是唯一的那一个出度为0强连通分量之中的顶点个数。#include #include #include #include #include #include #include #define M 10005using namespace std;int dfn[

2014-01-22 14:22:57 778

原创 POJ2029--Get Many Persimmon Trees(枚举+二维树状数组)

暴力枚举起点,然后就是裸的二维树状数组。#include #include #include #include #include #include #include #include #include #define INF 999999999#define M 105#define LL long long#define Min(a,b) a<b?a:b#defin

2014-01-21 15:25:06 884

原创 POJ2155--Matrix(二维树状数组)

对于翻转,我们可以直接+1,取其结果%2即可。#include #include #include #include #include #include #include #include #include #define INF 999999999#define M 1005#define LL long long#define Min(a,b) a<b?a:b#d

2014-01-21 14:15:33 532

原创 POJ3067--Japan(树状数组)

题意就是让你求交点有多少个。我们可以先按a从小到大排序,a相等就按b从小到大排序,这样题意就变成了让我们求b数组的逆序数了。代码如下:#include #include #include #include #include #define M 1005#define LL long longusing namespace std;int n,m,k;int c[M]

2014-01-17 16:11:08 866

原创 二维树状数组模版

int Lowbit(int x){ return x & (-x);}void Update(int x,int y,int d){ int i,j; for(i=x;i<=s;i+=Lowbit(i)) { for(j=y;j<=s;j+=Lowbit(j)) { c[i][j]+=d; } }}LL Sum(int x,int y){ int

2014-01-16 20:25:36 584

原创 POJ1195--Mobile phones(树状数组)

二维树状数组,改下可直接套模版,注意点就是坐标中有0的情况,所以只要x和y都加上1即可。#include #include #include #include #include #define M 1500#define LL long longusing namespace std;int op,s;int c[M][M];int Lowbit(int x){ r

2014-01-16 20:24:24 706

原创 树状数组求逆序数

给你一组数据,让你求它的逆序数,我们可以先将这么数从小到大排序,然后一个一个插入到树状数组中去,c[i]表示第i个数前面有多少个数比它小,它的逆序就是i-Sum(a[i])。代码如下:#include #include #include #include #include #define M 500005#define LL long longusing namespace

2014-01-16 16:01:58 815

转载 树状数组

http://www.cppblog.com/Ylemzy/articles/98322.html这里面讲的应该是比较清楚了。

2014-01-16 14:14:03 437

原创 POJ1797--Heavy Transportation

本题可以用dijkstra做,但是dis数组表示的不是从起点到i点的最短距离,而是最大载量,然后再改变下松弛条件,就可以轻松AC。#include #include #include #include #include #define INF 1>>30#define M 1005#define Min(a,b) a<b?a:b#define Max(a,b) a>b?a:b

2014-01-15 15:12:06 799

空空如也

空空如也

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

TA关注的人

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