Java 旅行路线的算法(有向图)
现在,我得到了一张无序火车票的清单,我需要弄清楚从哪里出发,在哪里停下来,然后用“所有”票四处旅行。我可以在一个城市旅行不止一次(这取决于我的机票)。那么,我怎样才能找到一个算法(伪代码)来解决这个tavel问题呢 我想找到起点和终点,但是我不知道如何找到可以使用所有车票的路线。以下是我所做的:Java 旅行路线的算法(有向图),java,algorithm,Java,Algorithm,现在,我得到了一张无序火车票的清单,我需要弄清楚从哪里出发,在哪里停下来,然后用“所有”票四处旅行。我可以在一个城市旅行不止一次(这取决于我的机票)。那么,我怎样才能找到一个算法(伪代码)来解决这个tavel问题呢 我想找到起点和终点,但是我不知道如何找到可以使用所有车票的路线。以下是我所做的: HashMap<String, List of tickets> outgoing = new HashMap<String, List of tickets>(); HashM
HashMap<String, List of tickets> outgoing = new HashMap<String, List of tickets>();
HashMap<String, Integer> incoming = new HashMap<String, Integer >();
For each ticket (t) in List {
String start == t. origin
String end == t.destination
If outGoing.contains(t) {
outGoing.get(start).add(t);
incoming.get(end)++;
Else
outGoing.put(start, EmptyList.add(t));
inComing.put(end, 1);
}
}
For each outGoing.Entry<String, List of tickets > entry: outGoing.entrySet()
{
String startingCity == “”;
String endingCity == “”;
String city = entry.getKey();
If outGoing. get(city). size > inComing.get(city); {
city == startingCity;
}
If outGoing. get(city). size < inComing.get(city); {
city == endingCity;
}
}
If (startingCity == “” && endingCity == “”) {
//Start anywhere, because it is a cycle.
} else {
//sort from startingCity to endingCity
}
HashMap outgoing=newhashmap();
HashMap incoming=新的HashMap();
对于列表中的每张票(t){
字符串开始==t.原点
字符串结束==t.destination
如果传出。包含(t){
传出.get(start).add(t);
传入。获取(结束)+;
其他的
outGoing.put(start,EmptyList.add(t));
输入。输入(结束,1);
}
}
对于每个outing.Entry:outing.entrySet()
{
字符串startingCity==“”;
字符串endingCity==“”;
字符串city=entry.getKey();
如果传出.get(城市).size>传入.get(城市){
城市==起始城市;
}
如果传出.get(城市).size<传入.get(城市){
城市==终点城市;
}
}
如果(起始城市==“”&结束城市==“”){
//从任何地方开始,因为这是一个循环。
}否则{
//从起始城市到结束城市排序
}
由于所有票证都定义了起点和目的地,并且要求您使用所有票证,因此您需要查找一个
该路径存在的条件为:
中介绍了一种有效的算法。迭代您的
车票列表
,构建一个目的地集
。构建一个连接唯一目的地的图表。尝试将边缘最小化,以降低成本(通常是行驶距离)。这通常被称为@ElliottFrisch:实际上,这个问题比TSP简单得多。我们被要求每张票使用一次,而不是每个城市只访问一次。@EyalSchneider嗨。我已经通读了你和我分享的算法。我有一个问题,不是一次删除一个邻接,而是一次循环删除所有邻接,然后在堆栈中添加所有邻接?非常感谢。你好我已经通读了你和我分享的算法。我有一个问题,不是一次删除一个邻接,而是一次循环删除所有邻接,然后在堆栈中添加所有邻接?谢谢@贾豪才:你说的“全部删除”是什么意思?您仍然需要在每一步测试您是否处于“死胡同”,或者您可以继续某些路径。此外,当从堆栈中删除时,不能假设可以从堆栈中删除完整的路径;你可能有一把叉子要检查。把它想象成一个DFS。