n只有2000,直接DFS就可以过了... -------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cctype>   #define rep( i, n ) for( int i = 0;…
2208: [Jsoi2010]连通数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=2208 Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图的连通数. Sample Input 3 010 001 100…
2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MB Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图的连通数. Sample Input 3 010 001 100 Sample Output 9 HINT 对于100%的数据,N不超过2000. Source Tips: 此题…
题目链接 先缩点,对于scc之间贡献即为szscc[i]*szscc[j] 用f[i][j]表示scci是否能到sccj 拓扑排序,每次把now的f或上to的f 用bitset优化 //63888kb 1080ms #include <cstdio> #include <cctype> #include <bitset> #include <algorithm> #define gc() getchar() const int N=2005,M=4e6+5;…
我总觉得枚举点bfs也行-- tarjan缩点,记一下每个scc的size,bitset压一下scc里的点,然后按拓扑倒序向上合并到达状态,然后加ans的时候记得乘size #include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> #include<bitset> using namespace std; const i…
题目大意:给定一个n个点的有向图,求有多少点对(x,y),使x沿边可到达y 设f[i][j]为从i到j是否可达 首先强联通分量中的随意两个点均可达 于是我们利用Tarjan缩点 缩点之后是一个拓扑图.我们求出拓扑序,沿着拓扑序从后向前DP,状态转移方程为: f[i][k]=or{ f[j][k] } (i有直连边到达j,1<=k<=n,n为强连通分量的个数) 鉴于每一个点的值仅仅会是1或者0.所以我们能够直接状压,或者干脆开bitset,总体取或就可以 时间复杂度O(mn/32) 今天各种手滑…
2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1371  Solved: 557[Submit][Status] Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图的连通数. Sample Input 3 010 001 100 Sample Output 9…
Description 度量一个有向图恋情情况的一个指标是连通,指途中可达点对的个数. 下图的连通数是14 现在要你求出连通数 Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图的连通数. 难得看到省选出这种简单题,难道是为了考链式前向星? 直接建边对每个点跑\(dfs\),对于到达的点直接\(ans++\),(即此时形成了点对. 这题貌似不能直接回溯,需要\(memse…
Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图的连通数. Sample Input 3 010 001 100 Sample Output 9HINT 对于100%的数据,N不超过2000. 看到这题然后马上打了一个tarjan 然后对每一个强连通分量dfs,A了之后感觉有点奇怪,这个复杂度是多少来着,我好像算不出来,果断百度题解 然后大囧..…
[题意]给定n个点的有向图,求可达点对数(互相可达算两对,含自身).n<=2000. [算法]强连通分量(tarjan)+拓扑排序+状态压缩(bitset) [题解]这题可以说非常经典了. 1.强连通分量(scc)内所有点可互达,对答案的贡献为cnt[i]*cnt[i](cnt[i]第i个scc内点的个数). 2.缩点得到新图,对新图中的每一个点开一个bitset[2000]来记录第i个点能否到达它,初始值为f[i][i]=1. bitset用法:http://blog.163.com/lixi…
http://blog.csdn.net/u013598409/article/details/47037499 里面似乎有生成数据的... //我本来的想法是tarjan缩点之后然后将图遍历一遍就可以了,复杂度应该是O(n2)的,为什么说这样是n3的啊... //=>这种做法是错的因为有可能会重复计算用一下传递闭包就可以了然而直接递推以前写的dfsqaq #include<cstdio> #include<cstring> #include<cctype> #i…
2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1879  Solved: 778[Submit][Status][Discuss] Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图的连通数. Sample Input 3 010 001 100 Sample…
2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2305  Solved: 989[Submit][Status][Discuss] Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图的连通数. Sample Input 3 010 001 100 Sample…
2208: [Jsoi2010]连通数 暴力过的. 没脸说... 正解好像是缩点+递推. 应该也不难写. code: #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int wx=4017; inline int read(){ int sum=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){…
Link: BZOJ 2208 连通数 Solution: 传递闭包模板题 传递闭包是集合中最小的二元关系,其实就是对二元关系的不断拓展,一般用$floyd$求解 这里要先跑一遍$tarjan$求出$SCC$,然后在$TopoSort$时顺便传递闭包,最后统计答案即可 Tips: 1.在$DAG$上递推使用拓扑排序更高效,直接$dfs$时间复杂度没有保证,很可能$TLE$ 2.如需对二进制位统一处理(位运算),使用$bitset$,能通过压位快32倍! 3.这题$O(n*m)$和$O(\frac…
[BZOJ2208][Jsoi2010]连通数 Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图的连通数. Sample Input 3 010 001 100 Sample Output 9 HINT 对于100%的数据,N不超过2000. 题解:一开始以为要tarjan+DFS,后来发现为什么要tarjan~ #include <cstdio…
[BZOJ2208][JSOI2010]连通数(Tarjan) 题面 BZOJ 洛谷 题解 先吐槽辣鸡洛谷数据,我写了个\(O(nm)\)的都过了. #include<iostream> #include<cstdio> using namespace std; #define MAX 2020 struct Line{int v,next;}e[MAX*MAX]; int h[MAX],cnt=1; inline void Add(int u,int v){e[cnt]=(Lin…
BZOJ_2208_[Jsoi2010]连通数_强连通分量+拓扑排序+手写bitset Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图的连通数. Sample Input 3 010 001 100 Sample Output 9 HINT 对于100%的数据,N不超过2000. 直接缩点+拓扑排序统计答案即可. 每步转移是O(n)的,可以用b…
Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图的连通数. Sample Input 3 010 001 100 Sample Output 9 HINT 对于100%的数据,N不超过2000. Solution 数据太水,对于每个点爆搜就能过 Code #include<iostream> #include<cstring> #i…
题目描述 输入格式 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. 输出格式 输出一行一个整数,表示该图的连通数. 样例 样例输入 3 010 001 100 样例输出 9 数据范围与提示 对于100%的数据,N不超过2000. solution: 这道题给出三种算法: DFS: 这道题搜索可以过 用vecter建边,若有一条由i指向j的边,那么把j压到i的vector中(这种建边方法好像比前向星快) 建立bool数组v…
先缩点,对于缩完点后的DAG,可以直接在每个scc dfs一次就可以求出终点是这个scc的点的点对个数. # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector> # include <queue> # include <stack> # include <map> # i…
tarjan有向图缩点的基础应用.把原图中某点的连通数转化为反向图中"能够到达某点的个数".缩点后,每个新点的贡献等于 原dcc大小 * f[i] 其中f[i]表示(包括该点自身)通向该点的点的个数.设u点为v的入度,满足转移方程: 所以我们按照拓扑序dp求解即可.f[i]的初值设为该分量的节点数. 这个题引出一个很重要的想法:如何避免两个强连通分量缩点时连有重边?对于2000的数据范围,一个二维布尔数组完全可以承受,但显然有更普适的优秀做法,这就是Hash.去重边实际上是二元组的判重…
正解其实是\(Tarjan\) + \(拓扑拓扑\),但是却可以被\(O(N^3 / 32)\)复杂度的传递闭包水过去.心疼一下写拓扑的小可爱们. 学到一个\(bitset\)优化布尔图的骚操作,直接压进去乱搞,能快不是一点. (基本上就是差了一个\(log\)) 先放代码. #include <bits/stdc++.h> using namespace std; int n; char s[2010]; bitset <2010> mp[2010]; int main () {…
思路 要求求每个点能到达的点数就是传递闭包 然后n^3Floyd可做,但是n=2000,然后bitset压位 复杂度\(O(\frac{n^3}{32})\),能过 代码 #include <cstdio> #include <cstring> #include <algorithm> #include <bitset> #include <string> #include <iostream> using namespace std…
Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图的连通数. HINT 对于100%的数据,N不超过2000. Solution \(Tarjan\) 缩点 \(+\) 拓扑排序 \(+\) \(bitset\) 优化状压 显然对于每个强联通分量我们都要求出在新图上它能到达哪些点. 如何求呢? 法一: \(dfs\),对于每个强联通分量找一下它连出…
Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图的连通数. Sample Input 3 010 001 100 Sample Output 9 HINT 对于100%的数据,N不超过2000. Source 第一轮 Solution 好好的暴力不写去写什么算法 虽然我也是学算法学傻了的,前两天看到一道题说这不是莫队裸题吗,然后其实前缀和就行了…
1825: [JSOI2010]蔬菜庆典 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 112  Solved: 45[Submit][Status][Discuss] Description Input Output 对于每组数据,输出一行.若蔬菜的总价能无限制增大,输出"+inf"(不含引号).否则输出一个整数,表示所有蔬菜的最大总价. Sample Input 5 -1 3 1 2 1 1 3 2 3 2 5 -1 3 1 2 1…
noip之前学的内容了,看到题竟然忘了怎么建图了,复习一下. 2-sat 大概是对于每个元素,它有0和1两种选择,必须选一个但不能同时选.这之间又有一些二元关系,比如x&y=1等等... 先把每个点拆成0和1两个点. 那么我们就建图,如果x等于A的话y必须等于B,那么从x的A点向y的B点连一条有向边,表示选了一个点它所有的后继点也必须选. 没有一组合法解的情况当且仅当x的01两个点缩点后在同一个强联通分量里. bzoj 1823 裸题 #include<iostream> #inclu…
连通数 bzoj-2208 Jsoi-2010 题目大意:给定一个n个节点的有向图,问每个节点可以到达的点的个数和. 注释:$1\le n\le 2000$. 想法:网上有好多tarjan+拓扑序dp的... 我们考虑暴力怎么做:显然就是用floyd的warshall求出连通矩阵,然后扫矩阵即可. 发现这个过程可以使用bitset进行优化,复杂度为$O(\frac{n^3}{32})$. 最后,附上丑陋的代码... ... #include <bits/stdc++.h> using name…
题目传送门 题目描述 度量一个有向图连通情况的一个指标是连通数,指图中可达顶点对的个数. 在上图中,顶点1可以到达1.2.3.4.5. 顶点2可以到达2.3.4.5. 顶点3可以到达3.4.5. 顶点4.5均只能到达自身,所以它的连通数为14. 请编写一个程序,输入一个图,求它的连通数. 输入格式 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. 输出格式 输出一行一个整数,表示该图的连通数. 样例 样例输入: 30100…