自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【区间dp】P4302 [SCOI2003]字符串折叠

dp[i][j]记录i-j的最短长度 因此初始状态为dp[i][i]=1; 状态转移方程为dp[i][j]由k从中间分开的两部分组成,首先我们需要判断一下i-k是否能够折叠,如果能够折叠就可以更新了 代码 #include<bits/stdc++.h> using namespace std; char s[105]; int n,dp[105][105]; bool check(char c[],int len,int l) { for(int t=l;t<len..

2020-09-28 22:46:31 84

原创 【区间dp】P3205 [HNOI2010]合唱队

dp[i][j][0/1]表示i-j是由上一次放左(0)/上一次放右(1)转移的来的 因此得到初始状态dp[i][i][0]=1; 注意这里不能把0和1都赋成1,否则会算多的 然后就是状态转移的步骤了 dp[i][j][0]可能是由两种推出来的:dp[i+1][j][0]和dp[i+1][j][1] 同理dp[i][j][1]是由:dp[i][j-1][0]和dp[i][j-1][1] 最终结果为dp[1][n][0]和dp[1][n][1]的和 代码 #include<bits/.

2020-09-28 22:43:37 147

原创 【区间dp】P2858 [USACO06FEB]Treats for the Cows G/S

dp[i][j]表示i-j的最大利润,所以dp的初始状态就是dp[i][i]=a[i]*n 然后对于每一个dp[i][j]都可能是上一步卖了左侧/右侧的进行的,这样就完成了状态转移 代码 #include<bits/stdc++.h> using namespace std; int n,dp[2005][2005],a[2005]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a.

2020-09-28 22:31:57 183

原创 【树的直径】P4381 [IOI2008]Island

给出一个基环树森林,求每一棵基环树的最大直径 首先用dfs找到树上的环,然后去计算环上的/环外的路径最大长度即可 也就是一个树形dp的过程,需要一个队列优化 代码 #include<bits/stdc++.h> using namespace std; const int maxn=1e6+5; int n,tot,l,que[maxn],tim,id[maxn],vis[maxn],fa[maxn],mark[maxn],times,inin[maxn],dep[maxn..

2020-09-22 23:20:04 121

原创 【lca+tarjan(圆方树)】P4320 道路相遇

首先tarjan求点双,在一个点双里的向一个新建的方点连边即可 这样就建好了圆方树,然后就树剖lca, 代码 #include<bits/stdc++.h> using namespace std; const int maxn=5e6+5; int head[maxn],topp[maxn],son[maxn],dep[maxn],sz[maxn],h[maxn],fa[maxn],top,st[maxn],num,n,q,m,cnt,times,cut[maxn],low[ma.

2020-09-17 23:00:25 153

原创 【tarjan】P3388 【模板】割点(割顶)

用tarjan算法求点双 注意统计点双的个数的时候不要算重了(错了好几次 代码 #include<bits/stdc++.h> using namespace std; const int maxn=1e5+5; int head[maxn],n,m,cnt,times,cut[maxn],low[maxn],dfn[maxn],tot; struct edge { int to,nxt; }e[maxn<<1]; void add(int x,int y) {..

2020-09-16 22:48:16 74

原创 P3384 【模板】轻重链剖分

代码 #include<bits/stdc++.h> using namespace std; const int maxn=2e6+5; int n,m,r,p,tot,cnt; int val[maxn],head[maxn],dep[maxn],top[maxn],id[maxn],re_val[maxn],sz[maxn],fa[maxn],son[maxn]; struct tree { int l,r,sz,w,lz; }tr[maxn<<2]; stru...

2020-09-16 22:39:00 80

原创 【树的直径】P2491 [SDOI2011]消防

首先不难证明,最优解一定出现在直径上,我们可以先跑两次dfs求出来直径 然后将直径上的点的距离算一下,之后再算非直径点的最大距离,求最大值即可 代码 #include<bits/stdc++.h> using namespace std; const int maxn=3e5+5; int n,s,tot,st,ed,max_dis; int head[maxn],line[maxn],pre[maxn],dist[maxn],dis[maxn]; struct edge {..

2020-09-14 22:36:48 75

原创 【搜索】P1985 [USACO07OPEN]翻转棋

考虑每个黑色位置是否被反过来,是由上一行的这个位置决定的,所以我们可以先全排类枚举出第一行的情况,然后每一行按照上一张的情况反转即可,做完最后一行的时候,检查一下是否都变成了白色即可 代码 #include<bits/stdc++.h> using namespace std; const int inf=INT_MAX; int n,m,a[20][20],d[20][20],ans,f[20],b[20][20],c[20][20]; void rev(int x,int y) .

2020-09-14 22:32:15 224

原创 【树形dp】UVA1218Perfect Service

注意这道题目inf开太大会爆掉int!! 代码 #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> using namespace std; const int maxn=1e5+5; const int inf=maxn; int n,tot,dp[maxn][3],head[maxn]; str...

2020-09-13 22:30:44 82

原创 【树的重心】POJ 3099 Go Go Gorelians

题目给定了一个三维坐标系的若干个点,每个点找离自己最近已知的点连边,形成一棵树,求这棵树的重心 按题意建边后,两次dfs求出直径,由于边权都是1,直接再直径上找中点即可 下图为样例的第二组图示 代码 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath>..

2020-09-13 20:02:08 135

原创 【tarjan】P2272 [ZJOI2007]最大半连通子图

首先可以用tarjan进行缩点,因为缩点后的结果对答案不会造成影响 然后就可以按照拓扑序进行求解了 方案数可以用dp的方式去求 注意:要在缩完点之后进行去重的操作,否则方案数会被算大 代码 ...

2020-09-11 23:54:27 67

原创 P5022 旅行

给定一个树/基环树,求遍历字典顺最小的方案 当原图是一棵树的时候,可以直接贪心的进行操作 当原图是一棵基环树的时候,我们先找到树上的环,然后枚举环上的一条边,将其删去,剩下的就和树上的操作一样了,最后将所有得到的方案进行比较,输出最小的即可 代码 #include<bits/stdc++.h> using namespace std; const int maxn=5005; int n,m,tot,vis[maxn],out[maxn],ans[maxn]; vector &l.

2020-09-10 22:45:29 87

原创 【最短路】P4408 [NOI2003]逃学的小孩

对于一张图上的任意三个点A,B,C 求max(min(dis[A][C],dis[B][C])+dis[A][B]) 我们先确定A,B为树上直径,可以用反证法简单证一下 然后就可以对于A和B两个点算一下其他点到A/B的距离,然后枚举点C即可 代码 #include<bits/stdc++.h> using namespace std; const int maxn=200000+5; int n,m,tot,st,ed; int head[maxn]; long long dis.

2020-09-10 22:42:01 118

原创 【分层图最短路】P4568 [JLOI2011]飞行路线

将免费乘坐的机会看做两个层之间的边,对于读入的每天一条边,都再k层内建边,以及跨层建边 然后就可以跑dijkstra 注意:最后的答案可能不在dis[t+k*n]上,因为最优解可能没有使用k次免费的机会,所以需要统计一下每层t位置的dis值,取最小即可 代码 #include<bits/stdc++.h> using namespace std; const int maxn=5e6+5; int n,m,k,s,t; int dis[maxn],vis[maxn],head[m.

2020-09-08 23:53:27 127

原创 【拓扑序】P1038 神经网络

先从入度为0的点开始,进行拓扑序列的计算,由于这个公式中的U(阈值)没有参与到乘法的部分,可以直接移项到左侧,进行计算就可以了,最后,输出出度为0的点的信息 代码 #include<bits/stdc++.h> using namespace std; const pair<int,int> PII; const int maxn=50000+5; const int inf=0x3f3f3f3f; int n,m,tot,in[maxn],out[maxn],head[.

2020-09-07 22:36:12 81

原创 【最短路】P3008 [USACO11JAN]Roads and Planes G

题目描述 有两种边:1.无向无负边权 2.有向有负边权 由于负边权的存在,无法直接使用dijkstra 而这道题目会卡spfa,因此我们需要去考虑其他的方法 我们可以先将第1种边连上,然后进行tarjan缩点(貌似并查集会更简单) 然后,对于生成的DAG图,可以用拓扑来求每个缩点后的点之间的最短路,每个集团内部的最短路,可以用dijkstra来计算 代码 #include<bits/stdc++.h> using namespace std; const pair&l..

2020-09-07 22:33:40 130

原创 Cactus问题总结

参考资料:2008年信息学国家集训队作业 有关仙人掌的问题 1.定义:若为有向图,要求:是一个强联通图,任意一个边只属于一个环;若为无向图,要求:是一个连通图,任意一条边,至多属于一个环 uva10510 给定一个有向图,判断它是否是一个有向Cactus。 可以进行类似tarjan的操作,记录下每个结点的父亲结点,如果遇到一个结点之前遍历过了,那么就把环上的结点都+1(注意当前结点不算,因为多个环可以连在一个结点上),然后如果有一个结点超过了2,就肯定不是仙人掌图了 代码 #i...

2020-09-06 22:22:22 312

空空如也

空空如也

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

TA关注的人

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