4.16练习周记 + 蓝桥杯总结
首先说下这周应该是我开学来最摆的一周(可能
这周一学习了有向边的强连通分量(tarjan),主要可用于解决有向图存在环的情况,通过缩点操作等,可以转换成DAG(有向无环图)再进行求解(缩点后的新图就是一个逆序拓扑图)。
然后刷了刷相关的例题
P3387 【模板】缩点 - 洛谷 纯板子题,将权值合并到缩点后的点上,然后跑一遍dfs就行
P1262 间谍网络 - 洛谷 对所有可以支付赎金的跑一边tarjan,如果存在没有被遍历过的点就说明不能控制全部间谍,反之就支付每个scc中赎金最小的就行(因为一个scc中都是可以互相到达的)
P2812 校园网络USACO]Network of Schools加强版 和uva那道只有数据上的差别,大致做法就是缩点然后统计入度 p p p和出度 q q q,有两小问,第一问是$p 0 的点数,第二问是 0的点数,第二问是 0的点数,第二问是max(p, q)$
P2272 ZJOI2007 最大半连通子图 - 洛谷 这题感觉更像个阅读理解…(可能OI题都这样), 大致做法也是先缩点,因为scc一定是半连通的,之后我们再建出新图,这里有个小坑点就是会存在重边的情况,所有我们应该先对边去重再建图。建完图之后跑一个最长路然后统计出方案数就可以了
for (int i = scc; i; i --) {
if (f[i] == 0) {
f[i] = sz[i]; //权值就是scc中点的数量
g[i] = 1;
}
for (int j = hs[i]; ~j; j = ne[j]) {
int k = e[j];
if (f[k] < f[i] + sz[k]) {
f[k] = f[i] + sz[k];
g[k] = g[i];
} else if (f[k] == f[i] + sz[k]) {
g[k] = (g[k] + g[i]) % mod;
}
}
}
int res = 0, sum = 0; //结点数和子图数量也就是方案数
for (int i = 1; i <= scc; i ++) {
if (res < f[i]) {
res = f[i];
sum = g[i];
} else if (res == f[i]) {
sum = (sum + g[i]) % mod;
}
}
这周还学了双连通分量,但还没做题,等下周再刷了, 这周也做了寄到两千分的CF题,总体感受是没题解就是一点也做不了,看题解就像在做阅读理解。
目前我的打算是两天开一场div2,尽量训练自己的思维速度和手速,争取能一小时内出4题,然后把赛后把EF补完
我的思维还是差了好多,需要多刷点新题多见识见识,而且模板时间长了不用就会忘,应该尽量复习下。
等到五月份我打算把学过的算法模板再系统整理一遍,然后专精数学和图论这方面。
蓝桥杯这次打的感觉不是很好,总体来说还是缺少点大型比赛的经验,刚开始开题开不出来就慌了,中间就对着死扣一道题,快结束了的时候才开始打暴力骗分。其实总的来说这次题真不难,除了最后一题的Dsu on Tree可能做不出来之外,其他题完全有能力做的。。。
打完一直也没补,可能等哪天想起来了再去补。