一个拓扑排序问题
来源:互联网 发布:萤石云软件下载 编辑:程序博客网 时间:2024/06/07 11:29
n个人排队, 每个人都有要求Request, 具体每个要求是希望排在某个人之前或者之后, 用类RequestItem表示。
例如有 1, 2, 3三个人, 1希望排在2之后3之前, 2希望排在1之前, 3希望排在1, 2之后。输出一个合理的排列
import java.util.HashMap;import java.util.LinkedList;import java.util.List;class RequestItem{String name;boolean front;}class Request{String name;List<RequestItem> items;}public class FindValidOrder {static List<String> validOrder(List<String> names, List<Request> requests){HashMap<String, List<String>> maps = new HashMap<String, List<String>>();for(String name: names){maps.put(name, new LinkedList<String>());}for(Request re: requests){for(RequestItem item: re.items){if(item.front){List<String> tmp = maps.get(item.name);if(!tmp.contains(re.name)){tmp.add(re.name);}}else{List<String> tmp = maps.get(re.name);if(!tmp.contains(item.name)){tmp.add(item.name);}}}}HashMap<String, Integer> counts = new HashMap<String, Integer>();for(String name: names){counts.put(name, 0);}for(String name: names){List<String> tmp = maps.get(name);for(String s: tmp){int tmpcount = counts.get(s)+1;counts.put(s, tmpcount);}}List<String> queue = new LinkedList<String>();while(!counts.isEmpty()){boolean found = false;String next = null;for(String name: counts.keySet()){if(counts.get(name)==0){next = name;found = true;}}if(!found) break;counts.remove(next);for(String s: maps.get(next)){int tmpcount = counts.get(s)-1;counts.put(s, tmpcount);}queue.add(next);}if(queue.size() == names.size()) return queue;return null;}public static void main(String [] args){List<String> names = new LinkedList<String>();names.add("1");names.add("2");names.add("3");List<Request> requests = new LinkedList<Request>();Request r = new Request();r.name = "1";r.items = new LinkedList<RequestItem>();RequestItem item = new RequestItem();item.name = "2";item.front = true;r.items.add(item);RequestItem item2 = new RequestItem();item2.name = "3";item2.front = false;r.items.add(item2);requests.add(r);Request r2 = new Request();r2.name = "2";r2.items = new LinkedList<RequestItem>();RequestItem item3 = new RequestItem();item3.name = "1";item3.front = false;r2.items.add(item3);requests.add(r);Request r3 = new Request();r3.name = "3";r3.items = new LinkedList<RequestItem>();RequestItem item4 = new RequestItem();item4.name = "2";item4.front = true;r3.items.add(item4);RequestItem item5 = new RequestItem();item5.name = "1";item5.front = true;r3.items.add(item5);requests.add(r3);List<String> order = validOrder(names, requests);System.out.println(order);}}
0 0
- 一个拓扑排序问题
- 一个问题,看topsort[拓扑排序]的两种解决办法。
- 值得说的一个问题:C语言实现拓扑排序
- 拓扑排序问题
- 拓扑排序问题
- 拓扑排序问题
- poj1094 好一个拓扑排序
- 拓扑排序解成绩排名问题
- 拓扑排序问题(队列实现)
- 一个简单拓扑排序的 java 实现
- 九度OJ 1448 拓扑排序问题
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- wget命令用法详解
- Hdu 5094 Maze(状压dp+bfs)
- 【原创】皇冠店主教你如何打造淘宝爆款,金钱买不到的经验
- 工厂方法模式
- Sex matters needing attention in the winter
- 一个拓扑排序问题
- hiho一下 第十一周——树中的最长路
- 为什么空类的大小不为0? (某公司校园招聘招聘面试试题)---我当时只知道其然, 但不知道所以然!
- jsonp跨域请求实现获取Google搜索结果
- 网络图片查看器无法获取图片的解决方法
- grub2配置
- 一个生产这消费者问题
- 快的在线笔试中的三个题目,JAVA,暂时作记载
- 关于Handler 的 removemessage