BZOJ4484: [Jsoi2015]最小表示(拓扑排序乱搞+bitset)
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 348 Solved: 172
[Submit][Status][Discuss]
Description
【故事背景】
还记得去年JYY所研究的强连通分量的问题吗?去年的题目里,JYY研究了对于有向图的“加边”问题。对于图论有着强烈兴趣的JYY,今年又琢磨起了“删边”的问题。
【问题描述】
对于一个N个点(每个点从1到N编号),M条边的有向图,JYY发现,如果从图中删去一些边,那么原图的连通性会发生改变;而也有一些边,删去之后图的连通性并不会发生改变。
JYY想知道,如果想要使得原图任意两点的连通性保持不变,我们最多能删掉多少条边呢?
为了简化一下大家的工作量,这次JYY保证他给定的有向图一定是一个有向无环图(JYY:大家经过去年的问题,都知道对于给任意有向图的问题,最后都能转化为有向无环图上的问题,所以今年JYY就干脆简化一下大家的工作)。
Input
输入一行包含两个正整数N和M。
接下来M行,每行包含两个1到N之间的正整数x_i和y_i,表示图中存在一条从x_i到y_i的有向边。
输入数据保证,任意两点间只会有至多一条边存在。
N<=30,000,M<=100,000
Output
输出一行包含一个整数,表示JYY最多可以删掉的边数。
Sample Input
1 2
2 3
3 5
4 5
1 5
1 3
Sample Output
HINT
Source
#include<cstdio>
#include<iostream>
#include<bitset>
#include<cstring>
#include<queue>
#include<algorithm>
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<23,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
using namespace std;
const int MAXN=;
inline int read()
{
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
struct node
{
int u,v,nxt;
}edge[MAXN*];
int head[MAXN],num=;
inline void AddEdge(int x,int y)
{
edge[num].u=x;
edge[num].v=y;
edge[num].nxt=head[x];
head[x]=num++;
}
int VisitTime[MAXN];//i是第几个入队的
int InputTime[MAXN];//第i个入队的是谁
int inder[MAXN];
bitset<MAXN>can[MAXN];//联通性
int N,M;
int to[MAXN];
int comp(const int &a,const int &b)
{
return VisitTime[a]<VisitTime[b];
}
void Topsort()
{
queue<int>q;
for(int i=;i<=N;i++)
if(inder[i]==) q.push(i);
int tot=;
while(q.size()!=)
{
int p=q.front();q.pop();
InputTime[++tot]=p;
VisitTime[p]=tot;
for(int i=head[p];i!=-;i=edge[i].nxt)
{
inder[edge[i].v]--;
if(inder[edge[i].v]==)
q.push(edge[i].v);
}
}
int ans=;
for(int i=N;i>=;i--)
{
int x=InputTime[i],tot=;
can[x][x]=;
for(int j=head[x];j!=-;j=edge[j].nxt)
to[++tot]=edge[j].v;
sort(to+,to+tot+,comp);
for(int j=;j<=tot;j++)
{
if(can[x][to[j]]) ans++;
else can[x]|=can[to[j]];
}
}
printf("%d",ans);
}
int main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
#endif
memset(head,-,sizeof(head));
N=read(),M=read();
for(int i=;i<=M;i++)
{
int x=read(),y=read();
AddEdge(x,y);
inder[y]++;
}
Topsort();
return ;
}
BZOJ4484: [Jsoi2015]最小表示(拓扑排序乱搞+bitset)的更多相关文章
- [BZOJ4484][JSOI2015]最小表示[拓扑排序+bitset]
题意 给你一个 \(n\) 个点 \(m\) 条边的 \(\rm DAG\) ,询问最多能够删除多少条边,使得图的连通性不变 \(n\leq 3\times 10^4\ ,m\leq 10^5\) . ...
- BZOJ 4484: [Jsoi2015]最小表示(拓扑排序+bitset)
传送门 解题思路 \(bitset\)维护连通性,给每个点开个\(bitset\),第\(i\)位为\(1\)则表示与第\(i\)位联通.算答案时显然要枚举每条边,而枚举边的顺序需要贪心,一个点先到达 ...
- BZOJ_2208_[Jsoi2010]连通数_强连通分量+拓扑排序+手写bitset
BZOJ_2208_[Jsoi2010]连通数_强连通分量+拓扑排序+手写bitset Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i ...
- BZOJ4484 JSOI2015最小表示(拓扑排序+bitset)
考虑在每个点的出边中删除哪些.如果其出边所指向的点中存在某点能到达另一点,那么显然指向被到达点的边是没有用的.于是拓扑排序逆序处理,按拓扑序枚举出边,bitset维护可达点集合即可. #include ...
- P2805 [NOI2009]植物大战僵尸(最小割+拓扑排序)
题意: n*m的矩阵,每个位置都有一个植物.每个植物都有一个价值(可以为负),以及一些它可以攻击的位置.从每行的最右面开始放置僵尸,僵尸从右往左行动,当僵尸在植物攻击范围内时会立刻死亡.僵尸每到一个位 ...
- bzoj4484[JSOI2015]最小表示
题意 给出一张DAG,要求删除尽量多的边使得连通性不变.(即:若删边前u到v有路径,则删边后仍有路径).点数30000,边数100000. 分析 如果从u到v有(u,v)这条边,且从u到v只有这一条路 ...
- HDU 1285 确定比赛名次【字典序最小的拓扑排序 + 优先队列】
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- 纯拓扑排序一搞poj2367
/* author: keyboarder time : 2016-05-18 12:21:26 */ #include<cstdio> #include<string.h> ...
- 【拓扑排序】【bitset】Gym - 101128A - Promotions
给你一张DAG,若选择u点,则必须先选择所有能到达其的点.问你在选择A个点的情况下,哪些点必选:选择B个点的情况下,哪些点必选:选择B个点的情况下,哪些点一定不选. 选择A个点的情况,必选的点是那些其 ...
随机推荐
- [Swift-2019力扣杯春季初赛]2. 校园自行车分配
在由 2D 网格表示的校园里有 n 位工人(worker)和 m 辆自行车(bike),n <= m.所有工人和自行车的位置都用网格上的 2D 坐标表示. 我们需要为每位工人分配一辆自行车.在所 ...
- 如何配置React Native真机调试-iOS
说在前面,本教程是建立在项目已经成功在模拟器上运行的基础上,如果你是还未配置好环境的新手,建议先从官网快速入门开始:官网英文版 . 中文版 ok, 切入正题,当你已经完成好环境配置,在模拟器上成功的运 ...
- IdentityServer4(1)- 特性一览
本地应用只本地客户端应用,例如QQ.微信 IdentityServer4是ASP.NET Core 2的OpenID Connect和OAuth 2.0框架.它可以在您的应用程序中提供以下功能: 它使 ...
- java数据类型大转换
1.字符串类型向整形转换 int age = Integer.parseInt(strAge); 2 int -> String int i=12;String s="";第 ...
- solr(五): centos中, 整合 tomcat&solr
前言 虽然windows下, tomcat和solr整合起来灰常的方便, 但是, 一般像这种东西, 都很少部署在windows中, 更多的是部署到linux中去. 其实, 步骤是一样的, 这里, 我在 ...
- web进修之—Hibernate 继承映射(5)
先看三个类的继承关系,Payment是父类,CashPayment和CreditCardPayment是Payment的子类: view plaincopy to clipboardprint p ...
- QT 完美实现圆形按钮
QT 版本:5.6.0 官方的按钮有些普通,如果我们想要换成自己喜欢的按钮而却无从下手,那么请继续往下阅读(皮一下). 首先,可以在网络上搜索一下自己喜欢的按钮图形(或者可以自行绘制),我以下面的图形 ...
- samba企业级实战应用详解-技术流ken
1.简介 Samba是一套使用SMB(Server Message Block)协议的应用程序, 通过支持这个协议, Samba允许Linux服务器与Windows系统之间进行通信,使跨平台的互访成为 ...
- java 开发 websocket 网页端聊天室
博客地址:https://ainyi.com/67 WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端. ...
- iOS UITextfield只允许输入数字和字母,长度限制
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementSt ...