CF Graphs
CF746G New Roads
构造题。
显然优先满足强制叶子节点的限制,设第 \(i\) 层叶节点数 \(b_i\) 。考虑到 \(a_i>a_{i+1}\) 则必有第 \(i\) 层 \(b_i\leftarrow a_i-a_{i+1}\) 个点强制为叶子节点,钦定叶子节点后 \(a_i\leftarrow a_i-b_i, k\leftarrow k -\sum{}^{} b_i\) ,显然序列 \(a\) 为单调不降序列。
此时还需钦定 \(k\) 个叶节点,第 \(i\) 层仍有 \(a_i\) 个节点状态待定,我们只需从 \(\sum_{}^{} a_i\) 个待定节点选取 \(k\) 个作为叶节点即可。
时间复杂度 \(\mathcal{O}(n)\)
Code
CF59E Shortest Path
有限制的最短路。
给定有序三元组 \(a,b,c\) 限制不能连续经过,边权为 \(1\) ,求最短路,\(n\le 3000,m\le 2e4,k\le 1e5\)。
看到 \(n\le 3e3\) ,回忆CSP-S2022 T1,搜索BFS即可。 \(dis_{i,j}\) 表示对于 \(i\) 点的上一个点为 \(j\) 的最短路长度,\(set\) 哈希维护不可经过的有序三元组。
Code
CF909E Coprocessor
DAG刷表题。
\(dis_i\) 表示当前点 \(i\) 需要 \(dis_i\) 次统一副机
对于每条由副机到主机的线路 \(S~T\) , \(dis_T\leftarrow max(dis_T, dis_S+1)\) (需要先启动主机再动副机,次数+1)。
对于每条其他线路, \(dis_T\leftarrow max(dis_T, dis_S)\) 。
答案为副机dis最大值: \(ans\leftarrow max(dis_i)\land a_i=1\)
Code
CF467D Fedor and Essay
恶心Tarjan缩点+DAG+字符串预处理———杂糅题
首先将每一个小写相同的字符串视为一个点,记字符 \(r\) 个数为 \(r_i\) ,长度为 \(l_i\) ,对于 \(x,y\) 反向建有向边,这样可以直接 \(x\stackrel{upd}{\leftarrow} y\) 。注意到转换操作可能存在环,Tarjan缩点合并 \(l_i,r_i\) 即可
Code
CF242D Dispute
贪心题,套图论的羊皮。
将有效点击分为主动和被动,注意到同时主动点击和先后主动点击但单点只点一次等价。
记 \(cur_i\) 为当前两种点击总次数,\(vis_i\) 为是否曾主动点击。
优先队列维护当前 \(a_i=cur_i\) 的点,每次弹出 \(a_i\) 最小的点并更新(主动点击)即可,若 \(vis_i=1\) 则需更新 \(2\) 次而无解。
正确性:注意到优先保证 \(a_i\) 较小的点消除了后效性,且原题只要求输出可行而非最优方案。
Code
CF229C Triangles
计数+思维题。定义“三角形”为图上长度为 \(3\) 的环。
整难则反,原图“三角形”数: \(tot=n*(n-1)*(n-2)/6\) ,可以观察到初始删一条扣除贡献为 \(n-2\) 。然后笔者感觉不好做了, \(\mathcal{O}(n^3)\) 容斥TLE
考虑稍稍转化题意:完全图 \(U\) 初始全为黑边,将 \(m\) 条边变为白边得到 \(U'\) ,求图 \(U'\) 纯色“三角形”个数(三边同色)。
\(U'\) 中“三角形”形态存在 \(4\) 种,只需求出“\(2\)黑\(1\)白”与“\(2\)白\(1\)黑”即可得到“纯色”。可以观察得到性质:三角形“杂色”当且仅当 \(2\) 个顶点连边“\(1\)黑\(1\)白”。
设 \(a_i\)为节点 \(i\) 的白边数,则节点 \(i\) 的“\(1\)黑\(1\)白”对数为 \(a_i*(n-a_i-1)\) ,由性质有“杂色三角形”总数: \(\frac{\sum a_i*(n-a_i-1)}{2}\) ,容斥答案: \(ans=tot-\frac{\sum a_i*(n-a_i-1)}{2}\) 。
Code
CF912D Fishes
期望最大化题。BFS属于是凑数。
考虑每个单元格对全局期望的贡献,选择前 \(k\) 大单元格即可。
给出式子:
总渔网可能方案数: \(tot=(n-r+1)*(m-r+1)\)
格子 \((x,y)\) 贡献期望: \(val_i=(min(x+r-1,n)-max(x,r)+1)*(min(y+r-1,m)-max(y,r)+1)*1.0\)
Code
CF875C National Property
2-SAT。
考虑相邻串 \(A\) 与 \(B\) 在 \(A_i,B_i\) 不相等(字典序必须存在差异)。根据 \(A_i,B_i\) 大小得到 \(A_i,B_i\) 取 \(A_i',B_i'\) 的约束关系,\(2-SAT/Tarjan\) 即可。
Code
CF666B World Tour
Meet in the Middle+最短路。
\(\mathcal{O}(n^2)\) 预处理正反全源最短路, \(f[u][0\sim 2][0/1]/pt[u][0\sim 2][0/1]\) 记录 \(u\) 源点的前 \(3\) 长路径长度与终点。
枚举中间节点 \(B,C\) ,根据前 \(3\) 优解:由 \(B\) 反向枚举 \(A\) ,由 \(C\) 正向枚举 \(D\) 。时间复杂度 \(\mathcal{O}(N^2)\)
本题与笔者第一道CCF赛时真题CSP-S2022 T1 假期计划非常相似———图论结构,利用Meet in the Middle降低时间复杂度,枚举较优解;唯一区别在于对边权或点权处理。
Code
CF840B Leha and another game about graph
奇偶特殊性题,连通图。
笔者第一次思考时,考虑将奇偶点尽可能化为无限制点,苦于1.贪心策略无法证明,2.全为奇偶点无法处理。
设白为 \(0\) ,黑为 \(1\) 。
首先考虑连边对点的度数改变情况:翻转两点的奇偶。更进一步,边对点的改变可以表示为: \(u,v\) 点 \(u\) 加上点 \(v\) 奇偶性,点 \(v\) 置为 \(0\) ,理解:同色相连全置为 \(0\) ,异色相连白置 \(1\) 黑置 \(0\) 。
有一个比较妙的性质:可以匹配当且仅当奇点个数为奇。很好理解:连边只有两端为黑才会 \(-2\) ,奇数奇点无法清零。
由性质可以用 \(-1\) 满足“奇数奇点”化为“偶数奇点”,无法满足即无解。
然后任选一个根节点,生成任意原图生成树, \(dfs\) 遍历回溯时 异色连边 并 根据子树连边改变自身节点度数 即可。
CF Official Editorial
Code
CF1037E Trips
倒推题。
处理出最终状态,由不满足要求的枝端节点开始删边,注意标记一条边只可被删一次就无效。
Code
CF936B Sleepy Game
记搜+判环题。
\(vis[i][0/1]\) 记录是否奇偶数步可达,最后Tarjan判环即可。
Code
CF920E Connected Components?
BruteForce!
先将每个点丢入set,按顺序取出点进行操作。
对于从set中取出的每个点 \(u\) ,我们要排出 \(u\) 所在连通分量的所有点。
queue循环找同一连通分量的点。遍历目前仍在set中的所有点,若无删边相连则说明在同一连通分量,将这一点放入queue;执行遍历直至更新出所有同一连通分量的点并从set中移除。
Why do you use set?---\(\mathcal{O}(nlogn)\)
Code
for(ll i = 1; i <= n ; i++) w.insert(i);
while(w.size()){
it = w.begin();
ll x = *it; it = w.erase(it);
++tot, cnt[tot]++;
queue<ll> q;
q.push(x);
while(!q.empty()){
ll u = q.front(); q.pop();
for(it = w.begin(); it != w.end(); )
if(e[u].count(*it)) ++it;
else cnt[tot]++, q.push((*it)), it=w.erase(it);
}
}
CF33D Knights
隐式图、建图。
由于圆不相交,只需将大圆包含小圆看作树上父子节点即可。 \(LCA\) 路径长即为答案。
注意处理根节点为最外侧一个极大的虚拟圆,包含关系特判极大值即可。
Code
CF545E Paths and Trees
最短路,最小生成树。
给定源点,求最小权最短路径生成树。
显然对于每一个非源点,确定父边(父节点入边)即可确定树的形态。 \(SPFA\)时选择每个非源点的权值最小的最短路径入边 即为答案。
Code
CF1280C Jeremy Bearimy
贪心?
每个点必须匹配——— \(p*2\) 。
对于点u的父边(向上连边):
最小值:最优为点对尽可能在子树内,最坏有子树奇数个点,贡献为 \(w\)。
最大值:最优为点对尽可能跨过这条边,最坏有 \(min(siz_u, n-siz_u)\) 个点对,贡献为 \(min(siz_u, n-siz_u)*w\) 。
Code
CF949C Data Center Maintenance
Tarjan缩点。
将“若 \(A\) 推迟,则 \(B\) 必须推迟”看作 \(A\rightarrow B\) 的一条有向边。
注意到有向图单一强连通分量必须同步改变,也可能使其他分量改变。因此缩点后得到DAG上出度为 \(0\) 的点 \(siz\) 最小者为答案。
Code
CF533B Work Group
树形DP。
\(f[i][0/1]\) 表示 \(u\) 子树内选奇数/偶数个点的最值。每个点初始化 \(f[u][0]=0,f[u][1]=-inf\) , \(f[u][1]\)最初非法。
状态转移方程:
f[u][0] = 0, f[u][1] = -inf;//f[u][1] is illegal at first
for(auto v : e[u]){
dfs(v); ll x0 = f[u][0], x1 = f[u][1];
f[u][0] = max(x0 + f[v][0], x1 + f[v][1]);
f[u][1] = max(x1 + f[v][0], x0 + f[v][1]);
}
f[u][1] = max(f[u][1], f[u][0] + v[u]);
CF609E Minimum spanning tree for each edge
最小生成树。
对于边 \(e\) 。若在最小生成树上,最小生成树权值即为答案。否则找到MST树上 \(u,v\) 两点路径上边权最大值替换即可———可以用倍增维护 \(LCA\) 与 \(Maxval\)
Code
CF1067B Multihedgehog
BFS?DFS?
笔者最初考虑以树的重心作为根节点,然而WA,该猜想目前没有甚么证明。
考虑从每个叶子节点BFS,最后得到根节点。然后DFS判断每个节点的子节点出度是否 \(\ge 3\) 即可。
正确性:对于一个合法图, \(BFS-dep/DFS-degree\) 得到结果一定正确。
Code

浙公网安备 33010602011771号