P3387 【模板】缩点 洛谷 java题解 连通图+拓扑排序
传送门:
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题解 连通图+拓扑排序相关推荐
- 洛谷 JAVA 题解 P1618 三连击(升级版)
package 新手村.BOSS入门练习; import java.util.Scanner; public class P1618 {public static void main(String[] ...
- 洛谷P1983 车站分级 拓扑排序
题目链接:https://www.luogu.com.cn/problem/P1983 此题是用拓扑排序求层数,将等级高的点连向等级的点,连成的图用拓扑排序看一下多少层,即答案. 代码如下 #incl ...
- 最小生成树 洛谷P3366【模板】最小生成树 洛谷P2820 局域网
嗯... 理解生成树的概念: 在一幅图中将所有n个点连接起来的n-1条边所形成的树. 最小生成树: 边权之和最小的生成树. 最小瓶颈生成树: 对于带权图,最大权值最小的生成树. 如何操作? 1.Pri ...
- 洛谷p1598题解记录
洛谷p1598题解记录 对这道题来说,输入几行数据其实无所谓,判定时是按照是否输入EOF来决定输入是否结束的. 代码 #include <stdio.h>char numberCount[ ...
- 快速幂||取余运算【模板】(洛谷P1226题题解,Java语言描述)
题目要求 P1226题目链接 分析 标准的快速幂取模算法板子,之前这个算法我在这篇文章中讲过了:<快速幂算法详解&&快速幂取模算法详解>. 这里选择使用比较简单的API实现 ...
- 洛谷Java入门级代码
Java入门级代码(洛谷题) 大小写字母之间的转换 //java中的大小写转换 //==小写转大写:toUpperCase(); //大写转小写:toLowerCase();import java.u ...
- 洛谷CF982B 题解
谢谢管理员大大给过 优先队列速通大法 hello!我又来水体了,不过嘛,相对来说这道题普及-不算水. 那我们就来研究研究吧. 先看题目 题目传送门 F1:0分暴力 一开始我也是闲的没事想要弄一下暴力做 ...
- 洛谷P1001题解--zhengjun
题目描述 输入两个整数 a,ba,ba,b,输出它们的和(∣a∣,∣b∣≤109|a|,|b |\le 10^9∣a∣,∣b∣≤109). 注意 PascalPascalPascal 使用intege ...
- 洛谷P1914题解——(本地测试AC但是交题爆零全WA)使用getchar();
本题最大的坑在于: windows环境下的换行符为\r\n,linux环境的换行符为\n. 我们再来看看洛谷的部分OJ判题机数据和机制 常见"我在本地/xxOJ AC了.洛谷却不过" ...
最新文章
- 60分钟入门深度学习工具PyTorch
- 让textarea完全显示文章并且不滚动、不可拖拽、不可编辑
- iOS---搜索功能
- 模拟电子技术_清华大学华成英教授主讲之符号说明
- 杭电1016Java实现
- Mysql当前模式让不记录日志_终于有人把MySQL 三大日志讲清楚了
- 数据结构之线段树合并——永无乡,Lomsat gelral,Tree Rotations,Tree Rotations Escape Through Leaf
- pythondistutils安装_python – 与distutils / pip一起安装Bash完成
- C++中继承与虚函数示例
- 给,你要的Go学习路线图来啦
- GiHub创建项目仓库与上传项目,超详细思维导图
- Java基础IO流(案例源码)【六】
- unity3D: visual Studio 调试 unity
- WinKawaks + 拳皇97 ROM 包在 PC 搭建拳皇97
- oracle 授权所有语句,oracle grant 授权语句
- 用HTML 格式导出Excel 时,如何保留显示网格线 转载
- python三维图旋转_3D图像旋转简单的ITK Python(3D Image Rotation Simple ITK Python)
- 数字中国城市巡礼之杭州,让城市长出“神经系统”
- java bigdecimal 取整数_java-检查BigDecimal是否为整数值
- python 自动生成问卷表的软件的设计与实现 毕业设计源码291138