博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法笔记_145:拓扑排序的应用(Java)
阅读量:4934 次
发布时间:2019-06-11

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

目录

 


1 问题描述

给出一些球,从1~N编号,他们的重量都不相同,也用1~N标记加以区分(这里真心恶毒啊,估计很多WA都是因为这里),然后给出一些约束条件,< a , b >要求编号为 a 的球必须比 b 轻,现在要求按编号升序输出每个球的重量,如果有多种解,输出字典序最小的那个。

例如:

input:

1

5 4

5 1
4 2
1 3
2 3

output:

2 4 5 3 1

 


2 解决方案

具体代码如下:

 

package com.liuzhen.practice;import java.util.ArrayList;import java.util.Scanner;public class Main {    public static int count;   //顶点的编号    public static int[] degree;   //计算顶点的入度    public static ArrayList
[] map; //表示图 public static ArrayList
result1 = new ArrayList
(); static class edge { public int a; //边的起点 public int b; //边的终点 public edge(int a, int b) { this.a = a; this.b = b; } } @SuppressWarnings("unchecked") public void init(int n) { count = n; degree = new int[n + 1]; map = new ArrayList[n + 1]; for(int i = 0;i <= n;i++) { map[i] = new ArrayList
(); degree[i] = 0; } return; } public String getResult() { String result = ""; int[] ans = new int[degree.length]; while(count >= 1) { int i = degree.length - 1; for(;i >= 1;i--) { if(degree[i] == 0) { ans[i] = count--; degree[i]--; for(int j = 0;j < map[i].size();j++) degree[map[i].get(j).b]--; break; } } if(i == 0) //此时给定图存在回环 return "-1"; } StringBuilder temp = new StringBuilder(""); for(int i = 1;i < ans.length;i++) { temp.append(ans[i]); if(i != ans.length - 1) temp.append(" "); } result = temp.toString(); return result; } public static void main(String[] args) { Main test = new Main(); Scanner in = new Scanner(System.in); int t = in.nextInt(); //要输入图的个数 while(t > 0) { t--; int n = in.nextInt(); test.init(n); int k = in.nextInt(); //输入图的边的个数 for(int i = 0;i < k;i++) { int a = in.nextInt(); int b = in.nextInt(); boolean judge = true; for(int j = 0;j < map[b].size();j++) { //检查重复边 if(map[b].get(j).b == a){ judge = false; break; } } if(judge && a != b) { map[b].add(new edge(b, a)); degree[a]++; //顶点a的入度自增1 } } result1.add(test.getResult()); } for(int i = 0;i < result1.size();i++) { System.out.println(result1.get(i)); } }}

 

运行结果:

25 45 14 21 32 310 54 18 17 84 12 82 4 5 3 15 1 6 2 7 8 3 4 9 10

 

 

 

 

 

参考资料:

   1. 

 

转载于:https://www.cnblogs.com/liuzhen1995/p/6762904.html

你可能感兴趣的文章
Kernel函数
查看>>
[zz]使用 libevent 和 libev 提高网络应用性能
查看>>
jQuery ajax - getJSON() 用法实例
查看>>
python输出带颜色的字体
查看>>
Linux故障处理最佳实践
查看>>
6标准文件读写
查看>>
jsTree 核心功能(core functionality) API
查看>>
Perl 旁站查询(站长工具提取)
查看>>
Perl oop链接数据库
查看>>
安卓开发16:Spinner 下拉列表控件
查看>>
参数数据自动生成app架构设计【一】
查看>>
网络虚拟化我眼中的OpenFlow
查看>>
多线程笔记1
查看>>
[leetcode] 3. Longest Substring Without Repeating Characters
查看>>
06 Frequently Asked Questions (FAQ) 常见问题解答 (常见问题)
查看>>
itemController.java
查看>>
获取判断IE版本 TypeError: Cannot read property 'msie' of undefined
查看>>
tcpreplay安装使用
查看>>
用systemtap对sysbench IO测试结果的分析1
查看>>
自增锁
查看>>