传送门:

P3387 【模板】缩点 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3387


问题分析

首先为了节省空间和提高效率,使用链式前向星来存储图,图论基操了属于。由于是有向图,所以是强连通图的题型。tarjin算法走一遍后得到一个新的图,这个图不存在强连通分量,形成一个有向无环图,显然可以用拓扑排序。


代码:

import java.io.*;
import java.util.*;public class Main {static int maxn=10001,maxm=100001;     //n和m的最大值static int n,m,cnt,num,idx,top;        //后面用到的所有全局静态变量static int[] eu=new int[maxm],ev=new int[maxm];static int[] vv=new int[maxm],to=new int[maxm];//vv,to,he是链式前向星标配static int[] he=new int[maxn],stk=new int[maxn];//stk模拟栈static int[] dfn=new int[maxn],low=new int[maxn];//dfn,low,scc,stk是tarjin标配static int[] scc=new int[maxn],ind=new int[maxn];//ind记录入度static int[] ga=new int[maxn],dis=new int[maxn];//ga记录每一个点的点权(tarjin后新的图)static int[] arr=new int[maxn];  //arr记录每一个点的点权(输入图)public static void main(String[] args) throws IOException {//输入部分n=nextInt();m=nextInt();for(int i=1;i<=n;i++) arr[i]=nextInt();for(int i=1;i<=m;i++){eu[i]=nextInt();ev[i]=nextInt();addEdge(eu[i],ev[i]);}for(int i=1;i<=n;i++)tarjin(i);Arrays.fill(vv,0);Arrays.fill(to,0);Arrays.fill(he,0);cnt=0;for(int i=1;i<=m;i++){if(scc[eu[i]]!=scc[ev[i]]){ind[scc[ev[i]]]++;addEdge(scc[eu[i]],scc[ev[i]]);}}int ans = topo();out.println(ans);out.close();        //close不能忘}//标准topo排序static int topo(){int ans=0;Queue<Integer> q = new LinkedList<>();for(int i=1;i<=idx;i++){if(ind[i]==0){dis[i]=ga[i];q.offer(i);}}while(!q.isEmpty()){Integer u = q.poll();for(int i=he[u];i>0;i=to[i]){int v=vv[i];ind[v]--;if(ind[v]==0) q.offer(v);dis[v]=Math.max(dis[v],dis[u]+ga[v]);ans=Math.max(ans,dis[v]);}}for(int i=1;i<=idx;i++)ans=Math.max(ans,dis[i]);return ans;}static void tarjin(int root){if(dfn[root]>0) return;    //若该点访问过了,returndfn[root]=low[root]=++num; //更新dfn和lowstk[++top]=root;           //更新栈for(int i=he[root];i>0;i=to[i]){int v=vv[i];if(dfn[v]==0){        //如果该点没有访问过tarjin(v);        //那么递归下去low[root]=Math.min(low[v],low[root]); } else if(scc[v]==0) {low[root]=Math.min(dfn[v],low[root]);}}//若dfn和low一致,说明栈中root上面所有点共同组成一个强连通子图if(dfn[root]==low[root]){idx++;for(;;){//将这些点合并,在新图中成为一个点int x=stk[top--];    //出栈scc[x]=idx;         //scc对应新图数据ga[idx]+=arr[x];    //更新新图点的点权if(x==root) break;}}}public static void addEdge(int u,int v){vv[++cnt]=v;to[cnt]=he[u];he[u]=cnt;}//以下为java魔法快速输入static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));public static int nextInt() throws IOException{in.nextToken();return (int)in.nval;}//在这里并没有用到,多写无碍public static String nextString() throws IOException {in.nextToken();return in.sval;}
}

P3387 【模板】缩点 洛谷 java题解 连通图+拓扑排序相关推荐

  1. 洛谷 JAVA 题解 P1618 三连击(升级版)

    package 新手村.BOSS入门练习; import java.util.Scanner; public class P1618 {public static void main(String[] ...

  2. 洛谷P1983 车站分级 拓扑排序

    题目链接:https://www.luogu.com.cn/problem/P1983 此题是用拓扑排序求层数,将等级高的点连向等级的点,连成的图用拓扑排序看一下多少层,即答案. 代码如下 #incl ...

  3. 最小生成树 洛谷P3366【模板】最小生成树 洛谷P2820 局域网

    嗯... 理解生成树的概念: 在一幅图中将所有n个点连接起来的n-1条边所形成的树. 最小生成树: 边权之和最小的生成树. 最小瓶颈生成树: 对于带权图,最大权值最小的生成树. 如何操作? 1.Pri ...

  4. 洛谷p1598题解记录

    洛谷p1598题解记录 对这道题来说,输入几行数据其实无所谓,判定时是按照是否输入EOF来决定输入是否结束的. 代码 #include <stdio.h>char numberCount[ ...

  5. 快速幂||取余运算【模板】(洛谷P1226题题解,Java语言描述)

    题目要求 P1226题目链接 分析 标准的快速幂取模算法板子,之前这个算法我在这篇文章中讲过了:<快速幂算法详解&&快速幂取模算法详解>. 这里选择使用比较简单的API实现 ...

  6. 洛谷Java入门级代码

    Java入门级代码(洛谷题) 大小写字母之间的转换 //java中的大小写转换 //==小写转大写:toUpperCase(); //大写转小写:toLowerCase();import java.u ...

  7. 洛谷CF982B 题解

    谢谢管理员大大给过 优先队列速通大法 hello!我又来水体了,不过嘛,相对来说这道题普及-不算水. 那我们就来研究研究吧. 先看题目 题目传送门 F1:0分暴力 一开始我也是闲的没事想要弄一下暴力做 ...

  8. 洛谷P1001题解--zhengjun

    题目描述 输入两个整数 a,ba,ba,b,输出它们的和(∣a∣,∣b∣≤109|a|,|b |\le 10^9∣a∣,∣b∣≤109). 注意 PascalPascalPascal 使用intege ...

  9. 洛谷P1914题解——(本地测试AC但是交题爆零全WA)使用getchar();

    本题最大的坑在于: windows环境下的换行符为\r\n,linux环境的换行符为\n. 我们再来看看洛谷的部分OJ判题机数据和机制 常见"我在本地/xxOJ AC了.洛谷却不过" ...

最新文章

  1. 60分钟入门深度学习工具PyTorch
  2. 让textarea完全显示文章并且不滚动、不可拖拽、不可编辑
  3. iOS---搜索功能
  4. 模拟电子技术_清华大学华成英教授主讲之符号说明
  5. 杭电1016Java实现
  6. Mysql当前模式让不记录日志_终于有人把MySQL 三大日志讲清楚了
  7. 数据结构之线段树合并——永无乡,Lomsat gelral,Tree Rotations,Tree Rotations Escape Through Leaf
  8. pythondistutils安装_python – 与distutils / pip一起安装Bash完成
  9. C++中继承与虚函数示例
  10. 给,你要的Go学习路线图来啦
  11. GiHub创建项目仓库与上传项目,超详细思维导图
  12. Java基础IO流(案例源码)【六】
  13. unity3D: visual Studio 调试 unity
  14. WinKawaks + 拳皇97 ROM 包在 PC 搭建拳皇97
  15. oracle 授权所有语句,oracle grant 授权语句
  16. 用HTML 格式导出Excel 时,如何保留显示网格线 转载
  17. python三维图旋转_3D图像旋转简单的ITK Python(3D Image Rotation Simple ITK Python)
  18. 数字中国城市巡礼之杭州,让城市长出“神经系统”
  19. java bigdecimal 取整数_java-检查BigDecimal是否为整数值
  20. python 自动生成问卷表的软件的设计与实现 毕业设计源码291138

热门文章

  1. 计算机教室英语手抄报,我的教室英语手抄报
  2. Linux的入门学习
  3. Git Bash 默认界面配色分析
  4. 7.微信小程序(布局适配与物理逻辑像素)
  5. JGG近期专刊征稿汇总|时空组学、人体微生物组、人类遗传病、小麦生物学
  6. 6个Excel操作技巧,期待明年更好的自己
  7. 计算机科学主题 一亩三分地 每日答题 题库
  8. 开发一个基于 Android系统车载智能APP
  9. 港股2017年表现全球最好,区块链将助推新经济牛市?
  10. c调python类_C调和弦及组成音