博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法笔记_145:拓扑排序的应用(Java)
阅读量:4946 次
发布时间: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

你可能感兴趣的文章
程序找不到jvm的解决方法
查看>>
Java中Volatile的理解
查看>>
c++primer page 249 answer
查看>>
04单例模式Singleton
查看>>
SSE图像算法优化系列六:OpenCv关于灰度积分图的SSE代码学习和改进。
查看>>
找考场
查看>>
暑假第一周进度总结(2018.7.9-2018.7.15)
查看>>
数据库程序接口——JDBC——功能第一篇——第一个程序
查看>>
NSOperation简单使用01
查看>>
javascript获取事件源对象和产生事件的对象
查看>>
iOS控件之UITextView
查看>>
第三次会议
查看>>
UNIX的套接口(Socket)编程简介
查看>>
CSF 中的应用程序请求路由
查看>>
Programming Ability Test学习 1035. 插入与归并(25)
查看>>
curl_multi_init 操作实例
查看>>
vue-swiper的使用
查看>>
RDLC设计
查看>>
bs4爬虫的一点心得----坑
查看>>
scp详解
查看>>