bzoj4484[JSOI2015]最小表示
题意
给出一张DAG,要求删除尽量多的边使得连通性不变.(即:若删边前u到v有路径,则删边后仍有路径).点数30000,边数100000.
分析
如果从u到v有(u,v)这条边,且从u到v只有这一条路径,那么这条边必须保留.否则这条边一定可以删除.因为如果有不止一条路径从u到v,必然存在点x(x!=u,x!=v)使得u可到达x,x可到达v.而删边后必然也满足u可到达x,x可到达v,所以直接删掉(u,v)这条边就可以了.
刚才的分析已经给出了一个判定方法.既然如果有不止一条路径从u到v,必然存在点x(x!=u,x!=v)使得u可到达x,x可到达v,那么我们对每条边(u,v),枚举是否存在这样的x即可.这需要我们求出每个点能到达的点的集合,以及能到达这个点的集合.大力压位一波就好了.因为是DAG所以这个集合可以递推.复杂度O(nm/32).
其实这题是看内存猜算法系列,榜上清一色的120多兆,不是压位还能是啥
我是200多兆
#include<cstdio>
const int mod=1000000007;
const int maxn=30005,maxm=200005;
struct edge{
int to,next;
}lst[maxm],lst2[maxm];int len=1,first[maxn],len2=1,first2[maxn];
void addedge(int a,int b){
lst[len].to=b;lst[len].next=first[a];first[a]=len++;
}
void addedge2(int a,int b){
lst2[len2].to=b;lst2[len2].next=first2[a];first2[a]=len2++;
}
int sz;
int reach[maxn][maxn/32+2],from[maxn][maxn/32+2];
int getbit(int u,int x){
return (reach[u][x/32]>>(x&31))&1;
}
void revbit(int u,int x){
reach[u][x/32]^=(1<<(x&31));
}
void revbit2(int u,int x){
from[u][x/32]^=(1<<(x&31));
}
bool vis[maxn];
void dfs(int x){
if(vis[x])return;
vis[x]=true;
for(int pt=first[x];pt;pt=lst[pt].next){
dfs(lst[pt].to);
for(int i=0;i<sz;++i)reach[x][i]|=reach[lst[pt].to][i];
}
revbit(x,x);
}
void dfs2(int x){
if(vis[x])return;
vis[x]=true;
for(int pt=first2[x];pt;pt=lst2[pt].next){
dfs2(lst2[pt].to);
for(int i=0;i<sz;++i)from[x][i]|=from[lst2[pt].to][i];
}
revbit2(x,x);
}
int main(){
int n,m;scanf("%d%d",&n,&m);sz=(n+31)/32+1;
for(int i=1,a,b;i<=m;++i){
scanf("%d%d",&a,&b);
addedge(a,b);addedge2(b,a);
}
for(int i=1;i<=n;++i)if(!vis[i])dfs(i);
for(int i=1;i<=n;++i)vis[i]=0;
for(int i=1;i<=n;++i)if(!vis[i])dfs2(i);
for(int i=1;i<=n;++i)revbit(i,i),revbit2(i,i);
int ans=0;
for(int i=1;i<=n;++i){
for(int pt=first[i];pt;pt=lst[pt].next){
int y=lst[pt].to;
for(int j=0;j<sz;++j){
if(from[y][j]&reach[i][j]){
ans++;break;
}
}
}
}
printf("%d\n",ans);
return 0;
}
bzoj4484[JSOI2015]最小表示的更多相关文章
- BZOJ4484 JSOI2015最小表示(拓扑排序+bitset)
考虑在每个点的出边中删除哪些.如果其出边所指向的点中存在某点能到达另一点,那么显然指向被到达点的边是没有用的.于是拓扑排序逆序处理,按拓扑序枚举出边,bitset维护可达点集合即可. #include ...
- BZOJ4484: [Jsoi2015]最小表示(拓扑排序乱搞+bitset)
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 348 Solved: 172[Submit][Status][Discuss] Descriptio ...
- [BZOJ4484][JSOI2015]最小表示[拓扑排序+bitset]
题意 给你一个 \(n\) 个点 \(m\) 条边的 \(\rm DAG\) ,询问最多能够删除多少条边,使得图的连通性不变 \(n\leq 3\times 10^4\ ,m\leq 10^5\) . ...
- 4484: [Jsoi2015]最小表示(拓扑序+bitset维护连通性)
4484: [Jsoi2015]最小表示 题目链接 题解: bitset的题感觉都好巧妙啊QAQ. 因为题目中给出的是一个DAG,如果\(u->v\)这条边可以删去,等价于还存在一个更长的路径可 ...
- [JSOI2015]最小表示
题目大意:尽可能多地去掉一个有向无环图上的边,使得图的连通性不变. 思路:拓扑排序,然后倒序求出每个结点到出度为$0$的点的距离$d$,再倒序遍历每一个点$x$,以$d$为关键字对其出边降序排序,尝试 ...
- bzoj 4484 [Jsoi2015]最小表示——bitset
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4484 每个点上存一下它到每个点的连通性.用 bitset 的话空间就是 \( \frac{n ...
- BZOJ 4484: [Jsoi2015]最小表示(拓扑排序+bitset)
传送门 解题思路 \(bitset\)维护连通性,给每个点开个\(bitset\),第\(i\)位为\(1\)则表示与第\(i\)位联通.算答案时显然要枚举每条边,而枚举边的顺序需要贪心,一个点先到达 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 【bzoj4484】【jsoi2015】最小表示
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 432 Solved: 223[Submit][Status][Discuss] Descriptio ...
随机推荐
- 20155321 《Java程序设计》实验五 网络编程与安全
实验内容 两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 结对实现中缀表达式转后缀表达式的功能 MyBC.java 结对 ...
- Spring MVC接受参数的注解
一.Request请求发出后,Headler Method是如何接收处理数据的? Headler Method绑定常用的参数注解,根据处理request的不同部分分为四类: A.处理 Request ...
- itop4412学习-上层应用多任务开发
1. 首先搭建虚拟机VMWARE12.0+UBUNTU16.04,不过报错了,说是要关闭计算机(非重启)-- 进入BIOS -- 设置BIOS的虚拟化(不打开,默认是工作在32位模式的,virtual ...
- 【mysql经典题目】科目成绩都大于80分\每个科目的第一名\总成绩排名
参考:http://blog.csdn.net/lifushan123/article/details/44948135 1.查询出科目成绩都大于80分的学生的名字? drop table if EX ...
- 五、Django之路由系统
1.普通路由匹配 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:它就是以这种方式告诉Django,用哪个URL调用 ...
- Linux checksum flag in kernel
net_device->feature | NETIF_F_NO_CSUM: No need to use L4 checksum, it used for loopback device. | ...
- 学习HTML 第四节.插入图像
学习HTML 第四节.插入图像 全是文字的网页太枯燥了吧,我们来搞个图片上去! <!DOCTYPE html><html><head><meta charse ...
- 王者荣耀交流协会-小组互评Alpha版本
小组分工如下: 1.探路者---贪吃蛇(测评人:王玉玲) 链接:http://www.cnblogs.com/WYLFZ/p/7805520.html http://www.cnblogs.co ...
- RIGHT-BICEP测试第二次
1.Right-结果是否正确? 正确 2.B-是否所有的边界条件都是正确的? 正确 3.P-是否满足性能要求? 部分满足 4.是否满足有无括号? 无 5.数字个数是否不超过十? 只是双目运算 6.能否 ...
- DCOM初步窥探二
1.COM进程透明性表现在“组件对象和客户程序可以拥有各自的空间,也可以共享同一个进程空间”. COM负责把客户的调用正确传到组件对象中,并保证参数传递的正确性. 组件对象和客户代码不必考虑调用传递的 ...