自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 【二分图】P2756 飞行员配对方案问题

正常的匈牙利算法,只要输出mat即为方案代码#include<bits/stdc++.h>using namespace std;const int maxn=10005;int n,m,cnt,head[maxn],mat[maxn],vis[maxn];struct edge{ int to,nxt;}G[maxn];void add(int x,int y){ G[++cnt].nxt=head[x]; G[cnt].to=y; head[x]=cnt;.

2020-07-31 17:38:03 123

原创 【二分图】P2055 [ZJOI2009]假期的宿舍

由于一个人对应一张床,所以考虑到二分图匹配对于不离校的住校生,直接将自己与自己的床建边离校的学生当然不用建边对于非住校生,那就和他有人际关系的人的床连边最后统计最大匹配即可代码#include<bits/stdc++.h>using namespace std;const int maxn=105;int t,n,x,cnt,vis[maxn],mat[maxn],s[maxn],h[maxn],head[maxn];struct edge{ int .

2020-07-31 17:28:30 98

原创 【二分图匹配】P1129 [ZJOI2007]矩阵游戏

这道题和横行和竖列交换的操作看起来与二分图无关在看了题解的思想后才知道,可以将每个黑子的横坐标与纵坐标之间连边,然后跑最大匹配,如果最大匹配n,则yes为什么呢?其实对于交换行和列,可以理解为改变左右两部的节点编号,去满足i->i之间有边,而我们不想进行改编号的操作,那么就可以去算最大匹配,如果最大匹配大于等于n,那就意味着可以通过改变编号的方式达到对角线的位置上有棋子这道题的思路真的很不错代码#include<bits/stdc++.h>using name.

2020-07-31 16:50:55 82

原创 【匈牙利算法】P3386 【模板】二分图最大匹配

给定一张二分图,其左部点集大小为 n,右部点集大小为 m,请求出其最大匹配。对于以上问题,匈牙利算法给出的解决方案为,对于每个节点u,先匹配它第一条边,若对应的v还没被匹配,就可以顺理成章的将u、v匹配上,进行下一个u的匹配;若此时的v已经被之前的u'匹配上了,那么就看u'能否有其他的选择,如果有就可以让u'退让,连v',然后u就可以连v了;如果u'没有其他选择,那就不让,使得u没有对应的匹配大概的思路就是这样其实也可以用网络流解决,将左部的节点连一个超级源点,右部的点全部连一个超级..

2020-07-31 16:26:34 126

原创 【线段树】P1531 I Hate It

单点修改,区间查询最大值的模板代码#include<bits/stdc++.h>using namespace std;const int maxn=2e5+5;int n,m;int a[maxn],tree[maxn<<2];void build(int now, int l,int r){ if(l==r) { tree[now]=a[l]; return; } int mid=(l+r)>>1; build(n..

2020-07-30 20:10:28 118

原创 【线段树】P4588 [TJOI2018]数学计算

这道题目,看起来只给了一个数,与线段树关系不大,但是将每次的操作存起来,就相当于是点更新,段查询(乘积),这样就可以转化为线段树的问题了。对于操作1,我们可以把对应的位置修改为相应值;操作2,把当前位置,和pos的位置改为1 并维护线段树即可代码#include<bits/stdc++.h>using namespace std;const int maxn=100000;int t,q,mod;long long mul[maxn<<2];voi..

2020-07-30 19:53:00 115

原创 【最短路】P3905 道路重建

这道题的建边还是挺有趣的因为要求重修道路的最小值,所以没被破坏的道路就可以将其边权赋为0,然后将被摧毁的边权保留正常,然后就可以跑最短路了floyd代码#include<bits/stdc++.h>using namespace std;const int maxn=105;int n,m,t,ma[maxn][maxn],f[maxn][maxn];int main(){ freopen("a.in","r",stdin); freopen("a.out",".

2020-07-30 01:00:47 198

原创 【树形dp】P2986 [USACO10MAR]Great Cow Gathering G

和上一题的换根树形dp类似,这道就是加上了边权,仍是两次dfs即可但是这个题的输出会很大,ans初值要赋的大一点(要不然最后两个点会wa)代码#include<bits/stdc++.h>using namespace std;const int maxn=5e5+5;long long n,cnt,head[maxn];long long c[maxn],tot,dis[maxn],f[maxn],size[maxn],ans=100000000000...

2020-07-29 23:56:09 168

原创 【树形dp】P3478 [POI2008]STA-Station

这道题目要求换根,先跑一次dfs,求出dep和size观察到如果将root从u换成u的一个儿子v,那么v的子树(包括v)的dep将会-1,一共-size[v],其余节点的dep都+1,共计n-size[v]这样就可以再跑一次dfs,求出最大的位置即可代码#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;int n,cnt,head[maxn];struct edge{ int to,.

2020-07-29 21:42:37 190

原创 【线段树】P3373 【模板】线段树 2

模板复习#include<bits/stdc++.h>using namespace std;long long c[500010];long long p;struct sgt{ long long sum[2000010]; long long addv[2000010]; long long mulv[2000010]; void build(int o,int l,int r){ addv[o]=0; mulv

2020-07-29 19:13:31 141

原创 【树形dp】P1273 有线电视网

f[i][j]表示i的子树,供j个家庭看比赛的最大收入,然后初始状态也就是每个子节点(家庭)都是他们支付的金额,以及供应0个家庭的收入为0,状态转移就是分组背包的思想,每个子节点可以选择供应1个/2个/.../k个,最后统计最大值即可答案就是第一个f[1][i]>0的i的值,i倒序枚举,因为要求最大值代码有一点读入叶子节点的费用时,注意下标的问题!#include<bits/stdc++.h>using namespace std;const int maxn=.

2020-07-29 00:24:35 104

原创 【树形dp】P1272 重建道路

同样是树形dp,常规的设f[i][j],为i的子树(包含i),要有j个节点,删去边数的最小值这样我们就可以初始化一下f,f[i][1]=son[i] 对于i只保留自己,需要删去son[i]条边然后就是状态转移了 对于一个节点,它的状态可能有它所有的儿子更新(也就是分组背包的思想)f[i][j]=min(f[i][j],f[i][j-k]+f[to][k]-1)剩下的就是一些小细节了,比如可以删去这个节点与父亲节点的边,还有答案不一定在根节点的位置,要跑一下每个点,求最小值代码.

2020-07-28 23:54:29 98

原创 【树形dp】P1352 没有上司的舞会

f[i][0]表示i的子树,不选i的最大值,f[i][1]表示i的子树,选i的最大值树形dp基础代码#include<bits/stdc++.h>using namespace std;const int maxn=6010;int n,h[maxn],out[maxn],f[maxn][2];vector <int> G[maxn];void dp(int x){ f[x][0]=0; f[x][1]=h[x]; for(int i=0;i&l.

2020-07-28 20:46:17 112

原创 【区间dp】P4342 [IOI1998]Polygon

这道题目第一步划分时,可以直接将其延长一倍,然后就直接进行操作,剩下的就是普通的区间dp了由于dp的内容有乘积,有可能是两个负数的最小值乘来,所以需要维护一个最小值代码#include<bits/stdc++.h>using namespace std;const int inf=0x3f3f3f3f;int n,ans=-inf;int a[105];int f[150][150],g[150][150];char c[105];int main(){..

2020-07-28 20:00:50 88

原创 【区间dp】P1063 能量项链

这道题和石子合并一样,也需要进行拆环的操作,剩下的就是基础的区间dp代码#include<bits/stdc++.h>using namespace std;const int maxn=205;int n,a[maxn<<1],f[maxn<<1][maxn<<1];int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]),a[i.

2020-07-28 15:35:39 89

原创 【区间dp】P3146 [USACO16OPEN]248 G

典型的区间dp,直接枚举区间长度,更新时,注意只有左右两个区间相等才能去更新代码#include<bits/stdc++.h>using namespace std;int n,ans;int f[250][250];int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&f[i][i]); for(int i=2;i<=n;i++)//枚举长度 for(int .

2020-07-28 15:10:42 116

原创 【动态规划】P1941 飞扬的小鸟

用f[i][j]表示小鸟从开始到(i,j)的位置最小点击次数,具体转移方程见代码注意:要判断是否超过上边界代码#include<bits/stdc++.h>using namespace std;const int maxn=1e4+5;const int maxm=2005;int n,m,p;int up[maxn],down[maxn],low[maxn],high[maxn];int f[maxn][maxm];int pipe[maxn];int m.

2020-07-28 14:51:44 261

原创 【动态规划】P1541 乌龟棋

记f[a][b][c][d]为四张牌分别用了a,b,c,d张时的最大得分,然后可以递推代码#include<bits/stdc++.h>using namespace std;int n,m,x,a[355],f[125][125][125][125],col[5];int main(){// freopen("a.in","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf(.

2020-07-28 10:06:52 108

原创 【动态规划】P3842 [TJOI2007]线段

由于每行的线段都需要走完,且不能向上走,所以对于走完每一行,只有两种可能 1)在线段右侧 2)在线段左侧然后就可以基于这样的特点去更新下一行对于第i行,如果结束在左端点,那么它可能是上一行从右端点下来,走到左侧;也可能是上一行的左侧走到当前行右侧位置,再下来走到左面,就可以以此dp了代码#include<bits/stdc++.h>using namespace std;const int maxn=2e4+5;int n,l[maxn],r[maxn],f[maxn][

2020-07-27 20:39:11 155

原创 【背包dp】P5020 货币系统

通过观察可以发现等价的两个货币系统其实是子集的关系,也就是说把给定系统内的可以用其他面额的钱表示出来的金额删掉即可关于证明:如果A和B货币系统等价,且存在一个数字t属于A,不属于B,那么根据题意,t这个金额一定可以被B的元素表示出来,也就是说,从A集合中删掉这个数字,仍不影响A系统能表示出的所有金额代码#include<bits/stdc++.h>using namespace std;int t,n,a[105],amount[25005];int main().

2020-07-27 15:49:47 118

原创 【状压dp】[HDU1400 & poj2411] Mondriaan‘s Dream

对于棋盘上每个点,都有几种可能,1.不放 2.横放的前一个 3.横放的后一个 4.竖放的上一个 5.竖放的下一个由于题目要求每个格子都被填满,所以可能1不存在然后,我们可以考虑用1表示这个格子被放上了2/3/5这几种可能,然后通过二级制压缩状态对于每一行都有一个数值来表示当前行的状态 now 以及上一行的状态 pre我们可以通过dfs将所有的可能的两行之间的状态转移预处理出来再填写第d列的时候 有这样几种可能1.当前位置为可能2,那么就可以把下一个一起处理了,这时候要求上一行...

2020-07-27 12:47:13 134

原创 【tarjan】P3627 [APIO2009]抢掠计划

由于路和银行都可以重复走,而银行里的钱只能被抢走一次,所以考虑到tarjan缩点,之后跑spfa的最长路即可代码#include<bits/stdc++.h>using namespace std;int n,m,s,p,top,times;const int maxn=5e5+5;const int inf=0x3f3f3f3f;int S,T,dis[maxn],st[maxn],vis[maxn],h[maxn],tot,x[maxn],y[maxn],col_t.

2020-07-26 15:44:48 117

原创 【动态规划】 基础题目(一)

1、P1359 租用游艇#include<bits/stdc++.h>using namespace std;int dp[205],n,x;int main(){ freopen("a.in","r",stdin); memset(dp,0x3f,sizeof(dp)); scanf("%d",&n); dp[1]=0; for(int i=1;i<=n;i++) for(int j=1+i;j<=n;j++) { scanf("%d",

2020-07-26 09:37:04 112

原创 【差分约束】P4878 [USACO05DEC]Layout G

差分约束建边后,两次spfa,一次判断有无负环,另一次用于计算答案代码#include<bits/stdc++.h>using namespace std;const int maxn=1005;const int maxm=50005;const int inf=0x3f3f3f3f;int n,ml,cnt,mr,update[maxn],head[maxn],dis[maxn],vis[maxn];struct edge{ int to,nxt,v;}G[.

2020-07-25 14:23:39 126

原创 【二分+差分约束】P4926 [1007]倍杀测量者

这道题目观察到输出的误差不超过1e-4,就会想到二分答案的思路,简单看一下是否符合单调性,也没什么问题然后就是差分约束了,但是这道题目比较特别之处在于它是乘积的形式,所以我们跑最长路的时候要进行相应的修改剩下的就是注意二分的精度问题了#include<bits/stdc++.h>using namespace std;int n,s,t;const int maxn=1005;int c[maxn],cnt,vis[maxn],head[maxn],update[maxn]

2020-07-25 13:21:39 141

原创 【差分约束】 P3275 [SCOI2011]糖果

这道题目的差分约束+SLF优化还是有一个点会TLE,所以我们要进行特判op=1或op=3时u=v要输出-1代码#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;const int inf=0x3f;int n,m,cnt;int head[maxn],dis[maxn],update[maxn],vis[maxn];struct edge{ int to,nxt,v;}G[..

2020-07-25 11:02:39 189

原创 【差分约束+spfa优化】P3084 [USACO13OPEN]Photo G

这道题和种树差不多,但是n和m数字较大,所以加上了SLF优化,但是最后一个点还是不过,待修改!#include<bits/stdc++.h>using namespace std;const int maxn=2e5+5;int cnt,n,m,update[maxn],dis[maxn],vis[maxn],head[maxn];struct edge{ int to,v,nxt;}G[maxn<<2];void add(int x,int y, int z)

2020-07-24 20:18:20 184

原创 【差分约束+floyd】P2474 [SCOI2008]天平

这道题不再是差分约束的模板了(看了题解才有了思路)首先可以根据题意知道,对于每对A、B,我们可以枚举C和D,去满足三种条件A+B>C+D A-C>D-B 转化成差分约束的形式然后我们可以记录maxi[i][j] 和 mini[i][j] 分别表示a[i]-a[j]的最大值和最小值这样对于输入的四种关系可以做出如下处理a[i]>a[j] <==> 1a[i]-a[j]2a[i]=a[j] <==> 0a[i]-a[j]0a[i].

2020-07-24 19:01:02 105

原创 【差分约束】P2294 [HNOI2005]狡猾的商人

同样是构造前缀和,跑最短路判负环#include<iostream>#include<cstdio>#include<stack>#include<queue>#include<cstring>#define maxn 1001using namespace std;int n,m,T,head[maxn],num,dis[maxn],t[maxn];bool vis[maxn];struct edge{ .

2020-07-24 11:58:25 129 1

原创 【差分约束】P5960 【模板】差分约束算法

构造超级源点,跑最短路,输出dis[i]即可#include<bits/stdc++.h>using namespace std;const int maxn=5005;const int inf=1e9;int n,m,s,cnt,head[maxn],vis[maxn],update[maxn],dis[maxn];struct edge{ int to,nxt,v;}G[maxn<<1];void add(int x,int y,int z){ G[

2020-07-23 14:39:11 120

原创 【差分约束】P1250种树

通过构造前缀和的差分约束,满足右-左种树数量,并且0i+1-i1,然后跑最长路,输出dis[n]#include<bits/stdc++.h>using namespace std;const int maxn=3e4+5;const int maxm=5e5+5;int n,m,cnt;int dis[maxn],inin[maxn],head[maxn];struct edge{ int to,nxt,v;}G[maxm*3];void add(int x, .

2020-07-23 14:24:08 144

原创 【最短路】 Johnson 算法

Johnson 算法这个算法可以用于处理稀疏图,带有负权的任意两点间的最短路问题如果点数 边数 ,那么堆优化的dij就可以解决了但是dij中不能存在负的边权,所以我们要考虑一种转化边权的方法可以通过类似差分约束的方法来重构边权对一条边 u,v ,他们的权值为e ,dis[i]表示1-i的最短路我们可以得到dis[v]-dis[u]+e0因此就可以把变成dis[v]-dis[u]+e增设一个超级源点S,由S向各点连一条权值为0的边,然后使用spfa求出点S到所有点的最短路dis

2020-07-23 13:40:48 396

原创 【tarjan】P1262 间谍网络

对能被收买的间谍进行tarjantarjan后求入度为0的新点,答案为这些新点中最小的点权之和如果跑完tarjan后,还有人没被走过,那就意味着无法全部收买,输出NO#include<bits/stdc++.h>using namespace std;const int maxn=3005;const int inf=0x3f3f3f3f;const int maxm=8005;int n,p,m;int money[maxn],ans,head[maxn],dfn[m

2020-07-23 11:30:06 161

原创 【差分约束】P1993 小 K 的农场

建立一个超级源点s,使得dis[x]>dis[i]然后就可以建边 ,a=b 可以拆成b-a0 和 a-b0之后再跑spfa,判断是否有负环,有负环则说明不能满足,无负环则能满足代码#include<bits/stdc++.h>using namespace std;const int maxm=5005;const int inf=0x3f3f3f3f;struct edge{ int to,v,nxt;}G[maxm*3];int head[max.

2020-07-23 11:21:41 132 1

原创 【tarjan】 P2002 消息扩散

tarjan后求入度为0的点的个数注意有自环,所以在读入时,要判断两个点不同再建边#include<bits/stdc++.h>using namespace std;const int maxn=1e5+5;const int maxm=5e5+5;int cnt,tot,times,ans,top,in[maxn],que[maxn],col[maxn],val[maxn],n,m,ux[maxm],uy[maxm];int head[maxn],dfn[maxn],lo

2020-07-23 10:13:12 186

原创 【tarjan】 P2341 [USACO03FALL][HAOI2006]受欢迎的牛 G

如果几头奶牛互相喜欢,那么我们就可把他们视为一个强连通分量,然后缩点。此时出度为0的点为最受明星牛,但如果出度为0的点超过了一个那么就无法做到有奶牛被所有人喜欢代码#include<bits/stdc++.h>using namespace std;const int maxn=1e4+5;const int maxm=5e4+5;int n,m,cnt,ans,ux[maxm],uy[maxm],dfn[maxn],low[maxn],head[maxn];int.

2020-07-23 09:20:50 145

原创 【tarjan+dp】P3387 【模板】缩点

可以多次走一个点或一条边,但只计算一次点权,意味着我们需要进行缩点tarjan进行求强联通分量主要记录DFN[i],LOW[i],以及维护que记录走过的点通过后向边和树枝边对LOW值的更新,当DFN[i]=LOW[i]时,就出现了强连通分量,可以进行缩点操作在缩点后,重新建图,然后就可以通过dp(记忆化) 进行统计代码#include<bits/stdc++.h>using namespace std;const int maxn=1e4+5;const in.

2020-07-23 08:45:37 81

原创 【最短路】P3385 【模板】负环

spfa判负环,记录每个点用于更新的次数,若该次数大于等于n次,就意味着出现了负环#include<bits/stdc++.h>using namespace std;int t,n,m,cnt,flag;const int inf=0x3f3f3f3f;int head[2005],update[2005],vis[2005],dis[2005];struct edge{ int to,v,nxt;}G[6005];void add(int x,int y,int.

2020-07-23 08:00:07 168

原创 【最短路+记忆化搜索】P3953 逛公园

首先,可以通过spfa求出最短路以及dis[i](表示1-i的最短路),然后考虑可以多走的距离为k,那么我们就可以枚举这一条边是否能被走,如果这条边连接i和j,那么就可以算出走这条边比原来最短路多走的距离为边权G[i].v-(d[i]-d[j]),然后就可以进行记忆化搜索,求总的方案tips:这道题由于数组较大、T组数较多,用memset初始化会T两个点代码#include<bits/stdc++.h>using namespace std;int t,n,m,k,p;.

2020-07-22 21:10:44 102

原创 【最短路+dp】P1772 [ZJOI2006]物流运输

这道题目由于观察到边数和节点数都较少,所以求最短路的方式就有很多(选择了spfa)可以先用次spfa求出path[i][j] 即i-j天的最短路然后就利用dp dp[i]表示前i天的最短路和,递推公式为dp[i]=min(dp[i],dp[j]+path[j+1][i]*(i-j)+k) j为0-i-1代码#include<bits/stdc++.h>using namespace std;const int inf=0x3f3f3f3f;int n,m,k,e,d.

2020-07-22 15:50:33 147

空空如也

空空如也

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

TA关注的人

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