Description

战狂也在玩《魔方王国》。他只会征兵而不会建城市,因此他决定对小奇的城市进行轰炸。
小奇有n 座城市,城市之间建立了m 条有向的地下通道。战狂会发起若干轮轰炸,每轮可以轰炸任意多个城市。
每座城市里都有战狂部署的间谍,在城市遭遇轰炸时,它们会通过地下通道撤离至其它城市。非常不幸的是,在地道里无法得知其它城市是否被轰炸,如果存在两个不同的城市i,j,它们在同一轮被轰炸,并且可以通过地道从城市i 到达城市j,那么城市i 的间谍可能因为撤离到城市j 而被炸死。为了避免这一情况,战狂不会在同一轮轰炸城市i 和城市j。
你需要求出战狂最少需要多少轮可以对每座城市都进行至少一次轰炸。

Input

第一行两个整数n,m。接下来m 行每行两个整数a,b 表示一条从a 连向b的单向边。

Output

输出一行仅一个整数表示答案。

Sample Input

5 4
1 2
2 3
3 1
4 5

Sample Output

3

Data Constraint

对于20%的数据,n,m<=10。
对于40%的数据,n,m<=1000。
对于另外30%的数据,保证无环。
100%的数据,n,m<=1000000。

Solution

这题拿出来愉悦大众
在往下看之前,请一定要确定你已经认真看过题
因为这题考语文


注意题面,i,j互相到达,是指他们在同一个联通块内而不是有边直接相连
这直接导致大把人爆5

那么怎么做呢?
先考虑没有环
答案显然是最长链长度
因为一条链上的点不能一起做,但层数相同不在同一条链上的点可以一起做

那么现在有环,用tarjan弄掉
由于n为10的6次房,需要人工栈或宽搜版人工栈
可以点进去看看我的模板

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define N 1010000
using namespace std;
int n,m,last[N],next[N*2],to[N*2],tot,bz[N],bz2[N],ans=0,zx[N],o,low[N],dfn[N],totot,p[N],zk[N],zi[N],c[N],q[N][2],r[N],num,f[N],a[N],d[N];
void putin(int x,int y)
{
    next[++tot]=last[x];last[x]=tot;to[tot]=y;
}
void read(int &x)
{
    char c=getchar();x=0;
    for(;c<'0'||c>'9';c=getchar());
    for(;c>='0'&&c<='9';c=getchar()) x=x*10+c-48;
}
void tarjan1()
{
    int x=zx[o];low[x]=dfn[x]=++tot;p[++p[0]]=x;bz[x]=bz2[x]=1;
    for(int i=last[x];i;i=next[i])
    {        if(!bz[to[i]])
        {            zk[o]=1;zi[o]=i;zx[++o]=to[i];zk[o]=0;return;
        }
        else if(bz2[to[i]]) low[x]=min(low[x],dfn[to[i]]);
    }
    if(low[x]==dfn[x])
    {        totot++;
        for(;p[p[0]+1]!=x;p[0]--) c[p[p[0]]]=totot,a[totot]++,bz2[p[p[0]]]=0;
    }
    o--;
}
void tarjan2()
{
    int x=zx[o];low[x]=min(low[x],low[to[zi[o]]]);
    for(int i=next[zi[o]];i;i=next[i])
    {        if(!bz[to[i]])
        {            zk[o]=1;zi[o]=i;zx[++o]=to[i];zk[o]=0;return;
        }
        else if(bz2[to[i]]) low[x]=min(low[x],dfn[to[i]]);
    }
    if(low[x]==dfn[x])
    {        totot++;
        for(;p[p[0]+1]!=x;p[0]--) c[p[p[0]]]=totot,a[totot]++,bz2[p[p[0]]]=0;
    }
    o--;
}
void tarjan(int x)
{
    zx[++o]=x;zk[o]=0;zi[o]=0;
    while(o>0){if(zk[o]==0) tarjan1(); else tarjan2();}
}
int main()
{
    freopen("bomb.in","r",stdin);
    freopen("bomb.out","w",stdout);
    scanf("%d%d",&n,&m);
    fo(i,1,m) read(q[i][0]),read(q[i][1]),putin(q[i][0],q[i][1]);
    tot=0;
    fo(i,1,n) if(!bz[i]) tarjan(i);
    memset(last,0,sizeof(last));num=totot;tot=0;
    fo(i,1,m) if(c[q[i][0]]!=c[q[i][1]]) putin(c[q[i][0]],c[q[i][1]]),r[c[q[i][1]]]++;
    int he=0,ta=0;
    fo(i,1,num) if(r[i]==0) d[++ta]=i,f[i]=a[i];
    while(he<ta)
    {        int x=d[++he];
        for(int i=last[x];i;i=next[i])
        {            f[to[i]]=max(f[to[i]],f[x]+a[to[i]]);
            r[to[i]]--;
            if(r[to[i]]==0) d[++ta]=to[i];
        }
    }
    fo(i,1,n) ans=max(ans,f[i]);
    printf("%d\n",ans);
}

【NOIP2017提高A组冲刺11.5】轰炸相关推荐

  1. JZOJ 5452. 【NOIP2017提高A组冲刺11.5】轰炸

    Description 战狂也在玩<魔方王国>.他只会征兵而不会建城市,因此他决定对小奇的城市进行轰炸. 小奇有n 座城市,城市之间建立了m 条有向的地下通道.战狂会发起若干轮轰炸,每轮可 ...

  2. JZOJ 5441. 【NOIP2017提高A组冲刺11.1】序列

    Description 给定一个1~n的排列x,每次你可以将x1~xi翻转.你需要求出将序列变为升序的最小操作次数.有多组数据. Input 第一行一个整数t表示数据组数. 每组数据第一行一个整数n, ...

  3. jzoj_5455. 【NOIP2017提高A组冲刺11.6】拆网线

    Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料.但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把 ...

  4. [JZOJ5459]【NOIP2017提高A组冲刺11.7】密室

    Description 小X 正困在一个密室里,他希望尽快逃出密室. 密室中有N 个房间,初始时,小X 在1 号房间,而出口在N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会 ...

  5. JZOJ 5458. 【NOIP2017提高A组冲刺11.7】质数

    Description 小X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小X 认为,质数是一切自然数起源的地方. 在小X 的认知里,质数是除了本身和1 以外,没有其他因数的数 ...

  6. JZOJ 5455. 【NOIP2017提高A组冲刺11.6】拆网线

    Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料.但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把 ...

  7. JZOJ 5445. 【NOIP2017提高A组冲刺11.2】失格

    Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...

  8. JZOJ5445. 【NOIP2017提高A组冲刺11.2】失格

    Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...

  9. JZOJ 5466. 【NOIP2017提高A组冲刺11.9】玩游戏

    Description 小A得了忧郁综合症,小B正在想办法开导她. 机智的小B决定陪着小A玩游戏,他从魔法的世界里变出一张无向联通图,每条边上都有边权.小B定义一条路径的权值为所有经过边中的最大权值, ...

最新文章

  1. DOTNET防止反编译
  2. ui kit html,开始使用
  3. 进程间通信——信号量及ipcs/ipcrm 介绍
  4. linux复制文件夹 实例,linux复制文件夹与文件实例介绍linux操作系统 -电脑资料
  5. 【.NETCore 3】Ids4 ║ 统一角色管理(上)
  6. E - Flow Gym - 102471E
  7. POJ 2195 【二分图最佳匹配】.cpp
  8. Nginx平滑添加模块
  9. 浏览器提示:你的连接不是专用连接的解决方法
  10. 梯度下降与一元线性回归
  11. 【易语言界面开发系列教程之(EX_UI使用系列教程(12)--EX组件(列表框EX))】
  12. WPF监控云台控制组件实现简单方案
  13. 第 9 章 Panel(面板)组件
  14. Metro风格的CSS框架 BootMetro
  15. oracle发生20001,Oracle IMP数据时报20001错误
  16. C++学习8——菜鸟教程自学
  17. AI大神Hinton再次“逃离”美国,成就了虎视眈眈的加拿大
  18. (转)ubuntu个人桌面使用经验
  19. 三极管放大概念和性能指标
  20. Android AbsoluteLayout 绝对布局应用场景介绍

热门文章

  1. 如何安装ATOM插件?
  2. 谷歌浏览器乱码的问题
  3. 实现人脸磨皮算法---OpenCV-Python开发指南(58)
  4. OpenInfra峰会首度落地中国,中国OpenStack方兴未艾
  5. numpy和panda快速入门
  6. 三个等号和二个等号的区别是
  7. 基金 撰写_撰写可转换的目标网页的7条提示
  8. cuda operator稀疏矩阵csr相加
  9. 离散数学数理逻辑部分【1】
  10. 《周易》六十四卦歌诀