scc

SDU暑期集训排位(8)

蹲街弑〆低调 提交于 2019-11-28 01:07:56
G. Extreme XOR Sum 题意 给一个序列,多组查询,每组查询一个区间,取出区间内的元素,相邻两项异或直到剩下一个数字。 做法 画杨辉三角。 把区间中的元素填到最底层。 考虑一个元素,如果到最上层的路径方案数为奇数,则有贡献。 区间 \([l,r]\) ,如果 \(\binom{r-l+1}{x-l}\) 为奇数,那么第 \(l+x\) 个位置对答案有贡献。 lucas 定理、Kummer 定理或者预处理 1~x 2 的幂出现多少次都可以。 I. In the Kingdom of Hirak 题意 每个人有 p 的概率变成憨憨,憨憨会被抓,如果一个SCC里有超过 k 个憨憨,整个SCC被抓,求被抓人数的期望。 做法 独立考虑每个 SCC。 枚举这个 SCC 里有几个憨憨。 E. Balanced String 题意 给一个多重集,构造字典序最小的序列,使得,前缀和的多重集等于此多重集。 做法 贪心,逐位考虑,如果能添加左括号就添加左括号,不能则添加右括号。 来源: https://www.cnblogs.com/FST-stay-night/p/11385133.html

20190818

北战南征 提交于 2019-11-27 20:26:13
B组题都能考爆炸我是完了…… 考试过程: 死刚一道题这种事情又不是第一次干怎么还敢这么搞啊?? T1一看dp嘛,和‘扫雷游戏’有点像(我是dp学傻了),打了个$n^2$的线性dp(考完之后才发现这部就是卡特兰数吗??),然后就想dp怎么优化,想了好久没有思路。去看T2,好像不可做,线段树?应该吧……T3,woc?Alpaca L. Sotomon是个什么玩意……看了看题,有向图,tarjan?拓扑?好像可以,复杂度都是$On$,只有建边是$n^2$的,什么鬼玩意,图论复杂度死于建边??想了想塞vector吧,然而有一种情况不会处理只会暴扫(怎么就没想起map呢??)手模几组样例发现没问题就过了。又看了看T1,觉得这个dp没前途好像没办法优化,换个状态定义?好像并不行……写T2吧,话说这数据范围给的是个啥,好像$mn$一分都没有,我打了一个$mn^2$的大暴力,估计得不了分,m次是一次一次模拟的,是不是有没有必要的计算呢?好像开始都是可以够到的,所以可以记录一下每个井能够下降的次数用线段树维护最大最小值,每次查询剩下大于n的个数,如果等于n直接跳过这一轮就做到了对无用枚举的加速,本来以为可以多拿点分结果数据好像很强???全部挂掉……之所以后来没有去想T1是因为觉得可能是个神仙dp毕竟我连状态定义都没想出来但相比之下T2至少有了方向所以改T2在当时来说可能是个更优的选则

2-SAT入门

佐手、 提交于 2019-11-27 16:55:44
SAT是适定性(Satisfiability)问题的简称。一般形式为k-适定性问题,简称 k-SAT。而当$k>2$ 时该问题为NP完全的。所以我们只研究$k=2$时 情况。 定义 2-SAT,简单的说就是给出$n$ 个集合,每个集合有两个元素,已知若干个$\langle a, b \rangle$ ,表示$a$与$b$ 矛盾(其中$a$ 与$b$ 属于不同的集合)。从每个集合选择一个元素,使得选出的$n$ 个元素两两不矛盾的问题,就是2-SAT问题。显然可能有多种选择方案,一般题中只需要求出一种即可。 解决方法 我们考虑将2-SAT问题往图论的方向靠,每个元素用结点来表示,元素间的矛盾关系建边来表示。 设$\{a, a'\}$是一个集合里的元素,$\{b, b'\}$是另一个集合里的元素,假如$a,b$之间有矛盾,那么连边$a\to b'$,表示选了$a$就要选$b'$,连边$b\to a'$,表示选了$b'$就要选$a$。 这样问题就转化为了从$2\times n$个结点里选出$n$个分属不同集合的结点,并且对于每个选出的结点,其所有后继结点也都被选出。 方法1:dfs暴搜 就是沿着图上一条路径,如果一个点被选择了,那么这条路径以后的点都将被选择,那么,出现不可行的情况就是,存在一个集合中两者都被选择了。最坏时间复杂度为$O(nm)$,虽然后面讲的Tarjan

图论 test solution

旧巷老猫 提交于 2019-11-27 07:01:09
图论 test solution T1:潜伏 题目背景 小悠回家之后,跟着母亲看了很多抗日神剧,其中不乏一些谍战片。 题目描述 解放前夕,北平城内潜伏着若干名地下党员,他们居住在城市的不同位置。现在身为地下党第一指挥官的你,想知道地下党员之间的最小通信距离,即从某一地下党员住处前往另一地下党员住处的距离的最小值。 我们可以将北平城视为一张N个点M条边的无向图,每条边连接两个点 ,且长度为 \(w_i\) 。 输入格式 每个测试点包含多组数据。 第一行,给出数据组数 ,之后依次输入每组数据。 每组数据的第一行,N,M,K,分别表示点数,边数,地下党员数。 之后M行,每 \(u_i,v_i,w_i\) 表示第i条边。 之后一行,K个整数代表地下党员所在结点。 结点编号为1到N,保证N>=K。 输出格式 对于每组数据,输出一行一个整数,表示地下党员之间的最小通信距离。 如果最小通信距离为∞,请输出-1代替。 样例输入 3 5 10 3 1 3 437 1 2 282 1 5 328 1 2 519 1 2 990 2 3 837 2 4 267 2 3 502 3 5 613 4 5 132 1 3 4 10 13 4 1 6 484 1 3 342 2 3 695 2 3 791 2 8 974 3 9 526 4 9 584 4 7 550 5 9 914 6 7 444 6 8

tarjan模板完整版

淺唱寂寞╮ 提交于 2019-11-26 22:31:26
https://www.luogu.org/problem/P2863 #include<cstdio> #include<vector> using namespace std; int dfn[10005],low[10005],stack[10005],scc[10005],num[10005],vis[10005]; int clock,scc_cnt,top; vector<int>e[10005]; inline void dfs_scc(int x) { dfn[x]=low[x]=++clock;//访问次序标记;x能到的祖先中节点编号最小的 stack[++top]=x;//把走过的节点入栈 vis[x]=1; for(int i=0;i<e[x].size();i++) { int now=e[x][i]; if(!dfn[now])//如果没有被访问过 { dfs_scc(now);//进它 low[x]=min(low[x],low[now]);//既然now是x的子节点,那么他们一定有公告的祖先,取个小的 } else if(vis[now])//如果他还没有被其他强连通分量使用 low[x]=min(low[x],dfn[now]);//那么再小一点 } if(low[x]==dfn[x]) { scc_cnt++; while(stack[top]!

poj2186--tarjan+缩点

只谈情不闲聊 提交于 2019-11-26 20:37:50
题目大意: 每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头 牛被所有的牛认为是受欢迎的。 先用tarjan求出每个强连通分量,再缩点,统计每个点的出度,如果有且只有1个出度为0的点,就输出这个点包含的节点数,否则输出0. 证明: 如果有强连通分量被孤立(即和其他强连通分量无边相连),那么答案一定是0,此时由于缩点后是一个DAG图,出度为0的点的个数一定大于1. 如果没有点被孤立,当出度为0的点多于1个时,由DAG图的性质可得,一定不存在一个点能从其他所有点到达。只有当出度为0的点的个数等于1时,这个出度为0的点才能被其他所有点到达。 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; #define cls(s,h) memset(s,h,sizeof s) const int maxn = 1e5 + 7; int n , m ; int tot; struct edge { int to,from,nxt; }e[maxn <

洛谷 P2746 [USACO5.3]校园网Network of Schools

ε祈祈猫儿з 提交于 2019-11-26 16:35:13
题目描述 一些学校连入一个电脑网络。那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”)。注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中。 你要写一个程序计算,根据协议,为了让网络中所有的学校都用上新软件,必须接受新软件副本的最少学校数目(子任务 A)。更进一步,我们想要确定通过给任意一个学校发送新软件,这个软件就会分发到网络中的所有学校。为了完成这个任务,我们可能必须扩展接收学校列表,使其加入新成员。计算最少需要增加几个扩展,使得不论我们给哪个学校发送新软件,它都会到达其余所有的学校(子任务 B)。一个扩展就是在一个学校的接收学校列表中引入一个新成员。 输入格式 输入文件的第一行包括一个整数 N:网络中的学校数目(2 <= N <= 100)。学校用前 N 个正整数标识。 接下来 N 行中每行都表示一个接收学校列表(分发列表)。第 i+1 行包括学校 i 的接收学校的标识符。每个列表用 0 结束。空列表只用一个 0 表示。 输出格式 你的程序应该在输出文件中输出两行。 第一行应该包括一个正整数:子任务 A 的解。 第二行应该包括子任务 B 的解。 输入输出样例 输入 #1 复制 5 2 4 3 0 4 5 0 0 0 1 0 输出 #1 复制 1 2 说明/提示 题目翻译来自NOCOW。 USACO Training