博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
拓扑排序 JAVA
阅读量:5070 次
发布时间:2019-06-12

本文共 2684 字,大约阅读时间需要 8 分钟。

判断是否成环 JAVA 代码实现

 

import java.util.LinkedList;import java.util.Scanner;public class Hello{	static int[][]mp;	static int[] indegree;	static int N, M;	static LinkedList
list = new LinkedList
(); public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt(); M = sc.nextInt(); mp = new int[N][N]; indegree = new int[N]; for(int i = 0; i < N; i ++) { indegree[i] = 0; for(int j = 0; j < N; j ++) { mp[i][j] = 0; } } int x, y; for(int i = 0; i < M; i ++) { x = sc.nextInt(); y = sc.nextInt(); if(mp[x][y] == 0) { mp[x][y] = 1; indegree[y] ++; } } topSort(); } private static void topSort() { int cnt = 0; for(int i = 0; i < N; i ++) { if(indegree[i] == 0) { list.addFirst(i); indegree[i] = -1; } } while(!list.isEmpty()) { int p = list.removeFirst(); System.out.print(p + " "); cnt ++; for(int j = 0; j < N; j ++) { if(mp[p][j] == 1) { mp[p][j] = 0; indegree[j] --; if(indegree[j] == 0) { list.addFirst(j); indegree[j] = -1; } } } } System.out.println(); if(cnt < N) System.out.println("Cycleeeeee!"); else System.out.println("Nooooooooo!"); } }

 

  但是上述是建立邻接矩阵的写法 当 N 太大的时候就不是很好了 所以可以用链表来存边和边的关系 会节省内存 所以以下是链表存图并判断拓扑关系

 

import java.util.concurrent.ArrayBlockingQueue;import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;public class Hello{		static int N, M;	static int[] v;	static int[] nx;	static int[] h;	static int[] ans;	static int[] in;	static int cnt, sz;	static LinkedList
list = new LinkedList
(); public static void main(String[] args) { Scanner sc = new Scanner(System.in); v = new int[100010]; nx = new int[100010]; h = new int[100010]; in = new int[100010]; N = sc.nextInt(); M = sc.nextInt(); init(); for(int i = 0; i < M; i ++) { int x, y; x = sc.nextInt(); y = sc.nextInt(); add(x, y); } topSort(); } public static void init() { for(int i = 0; i < 100010; i ++) { h[i] = -1; in[i] = 0; } sz = 0; } public static void add(int a, int b) { v[sz] = b; nx[sz] = h[a]; h[a] = sz; in[b] ++; sz ++; } public static void topSort() { for(int i = 0; i < N; i ++) { if(in[i] == 0) list.addFirst(i); } while(!list.isEmpty()) { int tp = list.removeFirst(); System.out.print(tp + " "); cnt ++; for(int i = h[tp]; i != -1; i = nx[i]) { in[v[i]] --; if(in[v[i]] == 0) list.addFirst(v[i]); } } System.out.println(); if(cnt != N) System.out.println("Circleeeeeeeeee"); else System.out.println("Noooooooooo"); } }

 

 

 

转载于:https://www.cnblogs.com/zlrrrr/p/11097113.html

你可能感兴趣的文章
openSuse beginner
查看>>
Codeforces 620E(线段树+dfs序+状态压缩)
查看>>
css3动画属性
查看>>
Mongodb 基本命令
查看>>
控制文件的备份与恢复
查看>>
软件目录结构规范
查看>>
mysqladmin
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
[置顶] Android仿人人客户端(v5.7.1)——人人授权访问界面
查看>>
ES6内置方法find 和 filter的区别在哪
查看>>
Android实现 ScrollView + ListView无滚动条滚动
查看>>
java学习笔记之String类
查看>>
UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
查看>>
硬件笔记之Thinkpad T470P更换2K屏幕
查看>>
iOS开发——缩放图片
查看>>
HTTP之URL的快捷方式
查看>>
满世界都是图论
查看>>
配置链路聚合中极小错误——失之毫厘谬以千里
查看>>
蓝桥杯-分小组-java
查看>>