BZOJ 4304 tarjan+topsort+bitset
我就是想骗一骗访问量
先Tarjan搞出来所有的强连通分量
正向连边 反向连边 topsort一发 搞出来每个点可以到哪些点 和哪些点可以到这个点
对于每条边 与一下 就是答案
//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int N=,M=N*N;
int n,m,T,jy,ans,r=;
int low[N],dfn[N],cnt,stk[N],vis[N],p[N],top;
set<int>s;
struct Edge{
bitset<N>f[N];
int mp[N][N],in[N];
void topsort(){
queue<int>q;
for(int i=;i<=T;i++)for(int j=;j<=T;j++)if(mp[i][j])in[j]++;
for(int i=;i<=T;i++)if(!in[i])q.push(i);
while(!q.empty()){
int t=q.front();q.pop();
for(int v=;v<=T;v++)if(mp[t][v]){
in[v]--,f[v]|=f[t];
if(!in[v])q.push(v);
}
}
}
}e[];
struct Road{int x,y;Road(int X=,int Y=):x(X),y(Y){};}rd[M];
void tarjan(int x){
low[x]=dfn[x]=++cnt,stk[++top]=x;vis[x]=;
for(int v=;v<=n;v++)if(e[].mp[x][v]){
if(!dfn[v])tarjan(v),low[x]=min(low[x],low[v]);
else if(vis[v])low[x]=min(low[x],dfn[v]);
}if(low[x]==dfn[x]){T++;do{jy=stk[top--],vis[jy]=;p[jy]=T;e[].f[T][jy]=e[].f[T][jy]=;}while(jy!=x);}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)scanf("%d%d",&rd[i].x,&rd[i].y),e[].mp[rd[i].x][rd[i].y]=;
for(int i=;i<=n;i++)if(!dfn[i])tarjan(i);
for(int i=;i<=m;i++)if(p[rd[i].x]!=p[rd[i].y])
e[].mp[p[rd[i].x]][p[rd[i].y]]=e[].mp[p[rd[i].y]][p[rd[i].x]]=;
e[].topsort();e[].topsort();
for(int i=;i<=m;i++){
int t=(int)(e[].f[p[rd[i].x]]&e[].f[p[rd[i].y]]).count();
if(ans<t)s.clear(),ans=t,s.insert(i);
else if(ans==t)s.insert(i);
}
printf("%d\n%d\n",ans,(int)s.size());
for(set<int>::iterator it=s.begin();it!=s.end();it++,r++)printf("%d%c",*it,r==s.size()?'\n':' ');
}
BZOJ 4304 tarjan+topsort+bitset的更多相关文章
- BZOJ.2208.[JSOI2010]连通数(bitset Tarjan 拓扑)
题目链接 先缩点,对于scc之间贡献即为szscc[i]*szscc[j] 用f[i][j]表示scci是否能到sccj 拓扑排序,每次把now的f或上to的f 用bitset优化 //63888kb ...
- Luogu3119 草鉴定-Tarjan+Topsort
Solution 简单的$Tarjan$题. 有大佬现成博客 就不写了 → 传送门 Code #include<cstdio> #include<cstring> #inclu ...
- 【UVA11324】 The Largest Clique (Tarjan+topsort/记忆化搜索)
UVA11324 The Largest Clique 题目描述 给你一张有向图 \(G\),求一个结点数最大的结点集,使得该结点集中的任意两个结点 \(u\) 和 \(v\) 满足:要么 \(u\) ...
- Tarjan+topsort(DP)【P3387】 [模板]缩点
Description 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次 ...
- [JSOI2010]连通数 (dfs或tarjan或bitset)+bitset学习
题目描述 输入格式 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. 输出格式 输出一行一个整数,表示该图的连通数. 样例 样 ...
- [bzoj 3687]简单题 bitset的运用
题意 给定一个正整数集,求所有子集算术和的异或和 题解 每次加入一个元素x,用原集合a xor (a<< x) 然后每一个值统计一下 bitset看起来很优越,是一个能位运算的布尔数组 ...
- BZOJ 3687: 简单题 bitset
3687: 简单题 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 小呆开始研究集合论了,他 ...
- bzoj 3687 简单题——bitset
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3687 关于 bitset :https://blog.csdn.net/snowy_smil ...
- bzoj 1123 tarjan求割点
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk mak ...
随机推荐
- buf.readIntBE()
buf.readIntBE(offset, byteLength[, noAssert]) buf.readIntLE(offset, byteLength[, noAssert]) offset { ...
- mac下安装好jdk和jmeter后设置环境变量
1. 执行vim ~/.bash_profile,打开文件: 2. 按i,进入输入状态,并输入如下信息,其中为jdk安装路径: export JAVA_HOME=/Library/Java/JavaV ...
- TensorFlow — 相关 API
TensorFlow — 相关 API TensorFlow 相关函数理解 任务时间:时间未知 tf.truncated_normal truncated_normal( shape, mean=0. ...
- BZOJ 1468 Tree 【模板】树上点分治
#include<cstdio> #include<algorithm> #define N 50010 #define M 500010 #define rg registe ...
- 自己写一个HashMap
package cn.aresoft; /** * HashMap原理 * * @author develp * HashMap是一种以键值对存储数据的数据结构,简单的来说是这样.内部怎么实现的呢?实 ...
- EasyUI Datagrid的简单使用
此前同样写过EasyUI Datagrid的demo,好记性不如烂笔头,何况记性也不是那么好,赶紧记录一下.照搬上一篇EasyUI Tree的格式. 实现效果:获取数据库表的数据,在EasyUI Da ...
- [luoguP1103] 书本整理(DP)
传送门 以 去掉多少个 为阶段不好做. 去掉 k 个也可以变成选 n - k 个 f[i][j] 表示前 i 个数中 选 j 个的最优解,a[i] 必选 f[i][j] = min(f[i][j], ...
- Uva12657 Boxes in a Line
题目链接:传送门 分析:每次操作都会花费大量时间,显然我们只需要关注每个元素的左边是啥,右边是啥就够了,那么用双向链表,l[i]表示i左边的数,r[i]表示i右边的数,每次操作模拟一下数组的变化就好了 ...
- java实现WebService 以及客户端不同的调用方式
java 实现WebService 以及不同的调用方式 webservice: 就是应用程序之间跨语言的调用 wwww.webxml.com.cn 1.xml 2. ws ...
- Java数据库连接池研究
一.背景 连接池简介: 连接池初始化时创建一定数量的连接,然后从连接池中重用连接,而不是每次创建一个新的. 数据库连接是一种关键的.有限的.昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对 ...