bzoj2208 [Jsoi2010]连通数 强连通分量缩点+拓扑排序+bitset
Description
对于100%的数据,N不超过2000。
Solution
容易想到要tarjan缩点按拓扑序递推,但是去重的步骤不好弄
C++STL中有bitset,用这个当成二进制按位状压即可
一开始错是没有给每个连通分量标记自己包含的点,这样就只算了相同连通分量的贡献。奈何拍的数据太弱,浪费了1h
Code
#include <stdio.h>
#include <string.h>
#include <bitset>
#include <stack>
#include <queue>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
#define drp(i,st,ed) for (int i=st;i>=ed;--i)
#define fill(x,t) memset(x,t,sizeof(x))
#define min(x,y) ((x)<(y)?(x):(y))
const int N=2025;
const int E=4000005;
std:: stack<int> stack;
std:: bitset<N> vis[N];
struct edge{int x,y,next;}e[E];
bool inStack[N];
int queue[N],head,tail;
int dfn[N],low[N],scc[N];
int ls[N],d[N],n,edCnt=0;
int size[N];
char str[N];
void addEdge(int x,int y) {e[++edCnt]=(edge){x,y,ls[x]};ls[x]=edCnt; d[y]++;
}
void dfs(int now) {dfn[now]=low[now]=++dfn[0];stack.push(now); inStack[now]=1;for (int i=ls[now];i;i=e[i].next) {if (!dfn[e[i].y]) {dfs(e[i].y);low[now]=min(low[now],low[e[i].y]);} else if (dfn[e[i].y]&&inStack[e[i].y]) low[now]=min(low[now],dfn[e[i].y]);}if (dfn[now]==low[now]) {scc[0]++;for (int tmp=0;tmp!=now;) {tmp=stack.top(); stack.pop();inStack[tmp]=0;scc[tmp]=scc[0];size[scc[0]]++;vis[scc[0]][tmp]=1;}}
}
void tarjan() {fill(dfn,0); fill(low,0);fill(inStack,0);rep(i,1,n)if (!dfn[i]) dfs(i);int tmp=edCnt;fill(ls,0); fill(d,0);rep(i,1,tmp) if (scc[e[i].x]!=scc[e[i].y]) {addEdge(scc[e[i].x],scc[e[i].y]);}
}
void top_sort() {head=1,tail=0;rep(i,1,scc[0]) if (!d[i]) {queue[++tail]=i;}int ans=0;while (head<=tail) {int now=queue[head++];ans+=size[now]*size[now];for (int i=ls[now];i;i=e[i].next) {if (!(--d[e[i].y])) queue[++tail]=e[i].y;}}drp(ti,scc[0],1) {int now=queue[ti];for (int i=ls[now];i;i=e[i].next) {vis[now]|=vis[e[i].y];}}rep(i,1,scc[0]) ans+=(vis[i].count()-size[i])*size[i];printf("%d\n", ans);
}
int main(void) {
// freopen("data.in","r",stdin);
// freopen("myp.out","w",stdout);scanf("%d",&n);rep(i,1,n) {scanf("%s",str);rep(j,1,n) if (str[j-1]=='1') addEdge(i,j);}tarjan();top_sort();return 0;
}
bzoj2208 [Jsoi2010]连通数 强连通分量缩点+拓扑排序+bitset相关推荐
- P2403 [SDOI2010]所驼门王的宝藏(强连通分量)(拓扑排序)
文章目录 题目描述 解析 代码 洛谷传送门 题目描述 解析 看题目要求很容易想到强连通分量缩点加拓扑dp 但是问题在于存图 第一感就是和暴力和每个点连边 但那样无论点数和边数都很爆炸 随后我们发现这个 ...
- Jzoj P4253 QYQ在艾泽拉斯___强连通分量缩点+拓扑序dp
题目大意: Q Y Q QYQ QYQ有 K K K次技能,每次可以从一个岛屿上闪现到另外一个岛屿上,每一个岛屿只能登上一次. Q Y Q QYQ QYQ能从任何一个城市开始旅程,也能在任何一个城市结 ...
- 【差分约束系统】【强连通分量缩点】【拓扑排序】【DAG最短路】CDOJ1638 红藕香残玉簟秋,轻解罗裳,独上兰舟。...
题意: 给定n个点(点权未知)和m条信息:u的权值>=v的权值+w 求点权的极小解和极大解(无解则输出-1) 极小解即每个点的点权可能的最小值 极大解即每个点的点权可能的最大值 题解: 差分约束 ...
- POJ1236Network of Schools——强连通分量缩点建图
[题目描述] A number of schools are connected to a computer network. Agreements have been developed among ...
- HDU 5934:Boom——强连通分量+缩点
[题目描述] There are N bombs needing exploding.Each bomb has three attributes: exploding radius ri, posi ...
- bzoj2208 [Jsoi2010]连通数
题目链接 先是强连通分量缩点,然后出来一个DAG 然后就可以DP啦,要找出每个SCC能到达的SCC有哪些 如果直接存一个二维数组来传递闭包的话肯定会TLE对吧 于是我们使用了神奇的bitset就快多了 ...
- The King’s Problem(tarjan求强连通分量缩点+匈牙利求有向无环图的最小路径覆盖)
Link:http://acm.hdu.edu.cn/showproblem.php?pid=3861 The King's Problem Time Limit: 2000/1000 MS (Jav ...
- bzoj 2330 / AcWing 368 银河 差分约束系统+tarjan缩点+拓扑排序
怎么最近bzoj一直上不了,莫非是挂了? AcWing的地址:https://www.acwing.com/problem/content/370/ 题意: 银河中的恒星浩如烟海,但是我们只关注那些最 ...
- BZOJ2208 [Jsoi2010]连通数
题目描述: 度量一个有向图连通情况的一个指标是连通,指途中可达点对的个数. 下图的连通数是14 现在要你求出连通数 n<=2000 题解: 网上的题解有的写得很复杂,但是看到n的范围这么小,当然 ...
最新文章
- pandas使用sort_index函数按照索引排序对dataframe的数据行进行排序(sort dataframe rows by index)
- 搜索引擎, 请手下留情
- encodeURIComponent编码2次
- 百度陆奇最新内部演讲:人工智能时代,给工程师的5个建议
- 那些做了十年的老开发都去哪了?
- 介绍一个功能强大的 Visual Studio Code 扩展 - Rest Client,能部分替代 Postman
- C# WPF 表单更改提示
- Win32动态库 Lib文件哪去了
- wxpython使用简介_wxpython简介
- linux磁盘管理の进阶篇一
- PyQt5-网格布局(QGridLayout)-10
- Word转PDF方法(jacob插件)
- 网络舆情分析系统具体使用功能及作用详解
- NETCTOSS代码实现第二版
- 苹果手机如何分享wifi密码_怎样用手机改wifi密码
- unity摄像头实物识别_“千万别让女朋友擦倒车摄像头,太tm可怕了哈哈哈哈哈!”...
- iphone查看python文件_通过python获取苹果手机备份文件中的照片,视频等信息采集...
- 致爱丽丝 之MY收藏
- java.lang.IllegalArgumentException: Malformed \uxxxx encoding
- 密码库LibTomCrypt学习记录——(2.25)分组密码算法的工作模式——EAX加密认证模式