Java实现Labeling Balls(拓扑排序的应用)
1 问题描述
给出一些球,从1N编号,他们的重量都不相同,也用1N标记加以区分(这里真心恶毒啊,估计很多WA都是因为这里),然后给出一些约束条件,< a , b >要求编号为 a 的球必须比 b 轻,现在要求按编号升序输出每个球的重量,如果有多种解,输出字典序最小的那个。
例如:
input:
1
5 4
5 1
4 2
1 3
2 3
output:
2 4 5 3 1
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<edge>[] map; //表示图
public static ArrayList<String> result1 = new ArrayList<String>();
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<edge>();
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));
}
}
}
运行结果:
4
1
2
3
3
5
1
1
8
1
8
4 5 3 1
1 6 2 7 8 3 4 9 10
Java实现Labeling Balls(拓扑排序的应用)的更多相关文章
- [ACM] POJ 3687 Labeling Balls (拓扑排序,反向生成端)
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10161 Accepted: 2810 D ...
- POJ3687.Labeling Balls 拓扑排序
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13201 Accepted: 3811 Descr ...
- poj 3687 Labeling Balls(拓扑排序)
题目:http://poj.org/problem?id=3687题意:n个重量为1~n的球,给定一些编号间的重量比较关系,现在给每个球编号,在符合条件的前提下使得编号小的球重量小.(先保证1号球最轻 ...
- PKU 3687 Labeling Balls(拓扑排序)
题目大意:原题链接 给出N个未编号的质量各不相同的球,以及它们质量轻重的大小关系,给它们从1-N贴标签编号,无重复.问是否存在可行的编号方法,不存在输出-1, 如果存在则输出唯一一种方案,此方案是使得 ...
- [poj3687]Labeling Balls_拓扑排序
Labeling Balls poj-3687 题目大意:给出一些球之间的大小关系,求在满足这样的关系下,编号小的尽量比编号大的球的方案. 注释:1<=N(球的个数)<=200,1< ...
- Labeling Balls(拓扑)
http://poj.org/problem?id=3687 看题意看了半天没看懂怎么回事,看完Discuss彻底凌乱了..后来看了题解才懂,就是逆向建图+拓扑排序,建图时要判重边. #include ...
- POJ3687——Labeling Balls(反向建图+拓扑排序)
Labeling Balls DescriptionWindy has N balls of distinct weights from 1 unit to N units. Now he tries ...
- poj 3687 Labeling Balls - 贪心 - 拓扑排序
Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 to N ...
- POJ 3687:Labeling Balls(优先队列+拓扑排序)
id=3687">Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10178 Acc ...
随机推荐
- Cordova+vue 混合app开发(一)创建Cordova项目
简介: Cordova包装你的HTML/JavaScript app到原生app容器中,可以让你访问每个平台设备的功能.这些功能通过统一的JavaScript API提供,让你轻松的编写一组代码运行在 ...
- JS理论-:一只tom猫告诉你构造函数 实例 实例原型 实例原型的实例原型是什么
参考地址:https://github.com/mqyqingfeng/Blog/issues/2 感谢这位大佬 下面说说我的理解: 第一,看下人物: tom--一只叫tom的猫 Cat()--猫的构 ...
- shrine
0x01 import flask import os app = flask.Flask(__name__) app.config['FLAG'] = os.environ.pop('FLAG') ...
- 去除 HTML 和 PHP 标记
strip_tags()函数,从字符串中去除html和php标记,随笔记一下,如果看过就过去,下次再找可能又会费点事,记下来下次好找
- 我的第一篇博客-学习书写markdown
Markdown学习(标题:井号+空格+标题名字 回车 ) 标题: 二级标题## 空格+名字 三级标题### 空格+名字 四级标题#### 空格+名字 五级标题##### 空格+名字 六级标题#### ...
- python selenium unittest Fixture(setUp/tearDown)笔记
Fixture用途: 1.做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现 2.测试用例的前置条件可以使用fixture实现 Fixture使用: ...
- docer run 、docker attach 与 docker exec的区别
进入容器的方式有以下三种: 使用ssh登陆进容器 使用nsenter.nsinit等第三方工具 使用Docker本身提供的工具 最佳方案为使用Docker本身提供的工具 docker run:创建和启 ...
- SSH三大框架知识点
Hibernate ****************************************************************************************** ...
- flask之Flask-session三方组件
from flask import Flask, views, render_template, request, session, redirect import redis as redis #p ...
- vue修改对象的属性值后页面不重新渲染
原文地址:vue修改对象的属性值后页面不重新渲染 最近项目在使用vue,遇到几次修改了对象的属性后,页面并不重新渲染,场景如下: HTML页面如下: [html] view plain copy &l ...