【发布时间】:2016-07-28 13:28:17
【问题描述】:
目前正在解决一个谜题并寻找一些关于按事件排序的提示。我想知道我应该遵循的程序到底是什么。考虑一下这个
我输入一个数字,然后n 输入
每个输入有两个事件,其中event1 event2 和event1 发生在event2 之前。
考虑输入
6
Eatfood Cuthair
Eatfood BrushTeeth
School EatFood
School DoHair
DoHair Meeting
Meeting Brushteeth
输出将是
school -> dohair-> eatfood -> meeting -> cuthair -> brushteeth
按这个顺序。因为如果我们把所有的东西都写下来,学校确实是第一件事,然后是dohair。如果存在多个可能的排序,则只需输出一个。您可以假设所有事件都以某种方式连接,并且不存在循环依赖关系。
我正在考虑做的是制作两个数组,一个包含所有eventOne's 和所有eventTwo's。我不确定从这里去哪里。我想在javascript中做到这一点。谢谢!建议任何提示或算法
另一个输入
6
vote_140_prof announce_140_prof
vote_140_prof first_day_of_classes
dev_shed_algo vote_140_prof
dev_shed_algo do_hair
do_hair big_meeting
big_meeting first_day_of_classes
输出
dev_shed_algo do_hair vote_140_prof big_meeting announce_140_prof first_day_of_classes
我在我的电脑上找到了解决方案文件,它是我不知道的python,但希望这能帮助其他人理解这个问题
from collections import defaultdict
def toposort(graph, roots):
res = [i for i in roots]
queue = [i for i in roots]
while queue:
for i in graph[queue.pop(0)]:
if i not in res:
res.append(i)
queue.append(i)
return res
graph = defaultdict(set)
a_set = set()
b_set = set()
for i in range(int(input())):
a, b = input().split()
a_set.add(a)
b_set.add(b)
graph[a].add(b)
print(" ".join(i for i in toposort(graph, a_set - b_set)))
我的尝试
var words =
'vote_140_prof announce_140_prof vote_140_prof first_day_of_classes devshed_algo vote_140_prof dev_shed_algo do_hair do_hair big_meeting big_meeting first_day_of_classes';
var events = words;
events = events.split(/\s+/);
console.log(events);
var obj = {};
for (var i = 0 ; i < events.length ; i++)
{
var name = events[i];
if(obj[name] === undefined )
{
obj[name] = [];
}
obj[name].push(events[i%2 === 1 ? i-1 : i+1]);
}
console.log(obj);
格式化
function sequenceEvents(pairs){
var edges = pairs.reduce(function(edges,pair){
edges.set(pair[0],[]).set(pair[1],[]);
new Map();
});
pairs.forEach(function(edges,pair){
edges.set(pair[0],[]).set(pair[1],[]);
});
var result = [];
while(edges.size){
var children = new Set([].concat.apply([],[...edges.value()]));
var roots = [...edges.keys()].filter(function(event){
!children.has(event);
});
if(!roots.length) throw "Cycle detected";
roots.forEach(function(root){
result.push(root);
edges.delete(root);
});
}
return result;
}
【问题讨论】:
-
所以您输入了一个引用第一个列表中的一个事件的数字,它需要从第一个列表中输出该事件,然后从第二个列表中输出该事件?
-
我忘了添加如果存在多个可能的排序,只需输出一个。我想这个问题有点奇怪,我不太清楚你的意思。基本上这个想法是找到发生的第一个事件。即使某事是一个输入的事件一,它也可以是另一个输入的事件 2,在这种情况下,输入 2 的输入 1 是第一个发生的事情,依此类推
-
可能是相当复杂的代码,因为您需要检查循环引用、孤儿等。What have you tried so far?
-
哦,是的“你可能假设所有事件都以某种方式连接,并且不存在循环依赖关系。”,我会在里面添加。道歉
-
添加了一个我在电脑上的问题文件夹中找到的python解决方案,目前正在尝试解决这个问题并更新你们
标签: javascript