5162 -- 【11.04题目】轰炸

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

Hint

【数据范围】
  对于20%的数据,n,m<=10。
  对于40%的数据,n,m<=1000。
  对于另外30%的数据,保证无环。
  对于100%的数据,n,m<=1000000
tarjan先缩环,然后记录联通块的大小直接dfs,dfs的时候加上自己儿子的最大值就可以了
code:
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<queue>
  4 #define N 1000005
  5 using namespace std;
  6 long long n,m;
  7 struct node{
  8     long long u,v;
  9 }e[N],e1[N];
 10 long long first[N],nxt[N],cnt;
 11 void add(long long u,long long v){
 12     e[++cnt].u=u;
 13     e[cnt].v=v;
 14     nxt[cnt]=first[u];
 15     first[u]=cnt;
 16 }
 17 long long num[N],first1[N],nxt1[N],cnt1;
 18 void add2(long long u,long long v){
 19     e1[++cnt1].u=u;
 20     e1[cnt1].v=v;
 21     nxt1[cnt1]=first1[u];
 22     first1[u]=cnt1;
 23 }
 24 long long sign,bcc,low[N],dfn[N],stack[N],instack[N],top,siz[N],belong[N];
 25 void tarjan(long long x){
 26     low[x]=dfn[x]=++sign;
 27     instack[x]=1;
 28     stack[++top]=x;
 29     for(long long i=first[x];i;i=nxt[i]){
 30         long long v=e[i].v;
 31         if(!dfn[v]){
 32             tarjan(v);
 33             low[x]=min(low[x],low[v]);
 34         }
 35         else if(instack[v])low[x]=min(low[x],dfn[v]);
 36     }
 37     if(dfn[x]==low[x]){
 38         long long t;
 39         bcc++;
 40         do{
 41             t=stack[top--];
 42             belong[t]=bcc;
 43             instack[t]=0;
 44             siz[bcc]++;
 45         }while(t!=x);
 46     }
 47 }
 48 long long maxk[N];
 49 void dfs(long long x){
 50     maxk[x]=siz[x];
 51     long long max0=0;
 52     for(long long i=first1[x];i;i=nxt1[i]){
 53         long long v=e1[i].v;
 54         if(maxk[v]){
 55             max0=max(max0,maxk[v]);
 56             continue;
 57         }
 58         dfs(v);
 59         max0=max(max0,maxk[v]);
 60     }
 61     maxk[x]+=max0;
 62 }
 63 long long read(){
 64     long long x=0,f=1;
 65     char c=getchar();
 66     while(!isdigit(c)){
 67         if(c=='-')f=-1;
 68         c=getchar();
 69     }
 70     while(isdigit(c)){
 71         x=(x<<3)+(x<<1)+c-'0';
 72         c=getchar();
 73     }
 74     return x*f;
 75 }
 76 int main(){
 77     int siz=80<<20;
 78     __asm__ ("movq %0,%%rsp\n"::"r"((char*)malloc(siz)+siz));
 79     n=read(),m=read();
 80     for(long long i=1;i<=m;i++){
 81         long long a,b;
 82         a=read(),b=read();
 83         add(a,b);
 84     }
 85     for(long long i=1;i<=n;i++){
 86         if(!dfn[i])tarjan(i);
 87     }
 88     for(long long i=1;i<=cnt;i++){
 89         long long u=e[i].u,v=e[i].v;
 90         if(belong[u]==belong[v])continue;
 91         add2(belong[u],belong[v]);
 92     }
 93     long long ans=0;
 94     for(long long i=1;i<=bcc;i++){
 95         if(!maxk[i])dfs(i);
 96         ans=max(ans,maxk[i]);
 97     }
 98     cout<<ans;
 99     exit(0);
100     return 0;
101 }

over

转载于:https://www.cnblogs.com/saionjisekai/p/9867099.html

10.28T5 tarjan+dfs相关推荐

  1. Hdu 5454,Minimum Cut,最近公共祖先+dfs遍历

    这道题补充了自己最近公共祖先的知识点: LCA(Lowest Common Ancestors)两种求法:①离线:tarjan+dfs:②在线算法,还没看 题意: 先给定一棵n个节点的树,然后给定一个 ...

  2. 数的直径(两次DFS)

    题目传送门 桃花 题目描述 桃花一簇开无主,可爱深红映浅红. --<题百叶桃花> 桃花长在桃树上,树的每个节点有一个桃花,调皮的HtBest想摘尽可能多的桃花.HtBest有一个魔法棒,摘 ...

  3. Gym - 102460A Rush Hour Puzzle(dfs迭代加深)

    题目链接:点击查看 题目大意:给出一个 6 * 6 的矩阵,表示华容道的游戏界面,现在需要红色汽车(标号为 1 )从第三行最右端到达出口的最短时间,如果无解或者步数超过 10 输出 -1 题目分析:因 ...

  4. poj 2531(dfs)

    题目链接:http://poj.org/problem?id=2531 思路:由于N才20,可以dfs爆搞,枚举所有的情况,复杂度为2^(n). 1 #include<iostream> ...

  5. shell 删除了hdfs 文件,在HDFS上删除超过10天的文件

    Is there a way to delete files older than 10 days on HDFS? In Linux I would use: find /path/to/direc ...

  6. LeetCode 1215. 步进数(BFS/DFS)

    文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 1. 题目 如果一个整数上的每一位数字与其相邻位上的数字的绝对差都是 1,那么这个数就是一个「步进数」. 例如,321 是一个步进数, ...

  7. LintCode 1353. 根节点到叶节点求和(DFS)

    1. 题目 给定仅包含来自0-9的数字的二叉树,每个根到叶路径可以表示数字. 举个例子:root-to-leaf路径1-> 2-> 3,它代表数字123,找到所有根到叶的数的总和 样例1 ...

  8. LeetCode 129. 求根到叶子节点数字之和(DFS)

    1. 题目 给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字. 例如,从根到叶子节点路径 1->2->3 代表数字 123. 计算从根到叶子节 ...

  9. [Tarjan] 洛谷 P1726 上白泽慧音

    题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间 ...

最新文章

  1. 14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3
  2. stolz定理考研能用吗_重磅,考研数学最后重点预测
  3. pandas.DataFrame()的基本操作
  4. 使用Fiddler对iPhone手机进行数据抓包分析
  5. python sklearn 绘制决策树模型的节点图
  6. Uber发布的CoordConv遭深度质疑,“翻译个坐标也需要训练?”
  7. 提高工作沟通技巧,加强沟通,不要推测他人发生问题发生的原因
  8. 如何使用小程序画布组件绘制自动缩放正方形
  9. git快速入门之一:创建本地仓库并同步到远程
  10. 在哪里可以查询汉语拼音音标?在线汉语拼音声调查询器
  11. Python字符串拼接的四种方法
  12. MySQL查询指令示例---初学者必看
  13. 华为工业云平台:制造业企业数据平台建设最佳实践分享
  14. Base64在线加密解密
  15. vue使用vue-video-player播放视频及遇到的问题
  16. 2022测试岗各大厂面试真题汇总(附带答案解析)
  17. 先学vba还是python-以Excel处理为目的学习python还是VBA?
  18. Exchange Server 2013邮箱记录管理MRM
  19. MD5、SHA1、CRC32值是干什么的?(转载)
  20. Codeforces Round #549 (Div. 2) 1143D. The Beatles

热门文章

  1. java中取系统时间_JAVA中获取当前系统时间(示例代码)
  2. 删除元素值最大的结点
  3. mysql where 大小写_java – 使用select where where Mysql在Mysql中区分大小写
  4. python实现接口自动化的视频_python实现头条项目接口自动化测试实战
  5. 微软高性能计算服务器pdf,微软高性能计算HPCserver2008技术概览.pdf
  6. c语言k歌4.0编程,一次在线K歌玩法的尝试
  7. cocos android 剪切板,Cocos Creator 点击按钮复制到剪切版
  8. JS 动态清除Div中内容
  9. Part Ⅳ Shopping 购物??
  10. Java Web学习笔记02:在Intellij里创建Web项目