1.6k1 分钟

第一问应该转化为求入度为0的点个数 第二问取入度为0的点个数与出度为0的点个数的较大值,注意特判仅有一个强连通分量的情况。 参考:题解 P2746 【[USACO5.3]校园网Network of Schools】 首先用Kosaraju求出各个强连通分量缩点,然后求出各个强连通分量间的有向边。 ```cpp const int N = 186; int n, cnt,mark[N],c,r; vi v[N], rv[N], dfn, scc[N]; set s[N], rs[N]; bitset<200> vis; void dfs(int
8671 分钟

在计算科学中,Kosaraju的算法(又称为–Sharir Kosaraju算法)是一个线性时间(linear time)算法找到的有向图的强连通分量。它利用了一个事实,逆图(与各边方向相同的图形反转, transpose graph)有相同的强连通分量的原始图。 首先第一遍dfs扫一遍得到逆后序压倒栈dfn中 int vis[MAX]; vector<int> dfn; f(i, 1, n){ if (!vis[i]) dfs(i); } void dfs(int x) { vis[x] &
1.5k1 分钟

缩点,将该有向有环图变为有向无环图,然后dp求解 因为已经变为有向无环图,所以其中为号强连通分量的儿子 首先用Kosaraju找强连通分量,第一遍dfs遍历,并从后往前压入dfn栈中,然后再FILO进行第二遍dfs,对于每次遍历到的点均构成一个强连通分量。 然后用set容器储存各个强连通分量的边,用dp求解 const int N = 2e4; int n, m, a[N], mark[N], t[N]; vi rim[N], nrim[N], dfn; bitset<10086> vis; set<int> s[N]; LL dp[N]; void d
4.1k4 分钟

过了五题,友好度++ 想着补完第六题再来,又鸽了 F题dfs做爆MLE A题按题意将差的绝对值相加即可 B题找规律,每4步都会回到原地,然后按原点奇偶分类讨论 C题,先将数排序,注意到每次操作中都会将前一次消去,所以只需维护排序后的两数之差即可,需要留意的是这个初始情况 D题,考虑最坏情况,蓝色数填满,红色数填满。于是只需判断蓝色数是不是均大于等于自身索引,红色数字是不是均小于等于减去自身索引 E题按题意模拟,模拟到break后撤销操作,然后输出答案 A: LL t; int main() { ios::sync_with_stdio(false); cin.tie(0);
1.6k1 分钟

太懒太菜了 洛谷P2548,一开始竟然想着字符串哈希比较。。。无语;;; #include <algorithm> #include <bitset> #include <map> #include <vector> #include <string> #include <iostream> #include <cmath> /* #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds