Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 旅行路线的算法(有向图)_Java_Algorithm - Fatal编程技术网

Java 旅行路线的算法(有向图)

Java 旅行路线的算法(有向图),java,algorithm,Java,Algorithm,现在,我得到了一张无序火车票的清单,我需要弄清楚从哪里出发,在哪里停下来,然后用“所有”票四处旅行。我可以在一个城市旅行不止一次(这取决于我的机票)。那么,我怎样才能找到一个算法(伪代码)来解决这个tavel问题呢 我想找到起点和终点,但是我不知道如何找到可以使用所有车票的路线。以下是我所做的: HashMap<String, List of tickets> outgoing = new HashMap<String, List of tickets>(); HashM

现在,我得到了一张无序火车票的清单,我需要弄清楚从哪里出发,在哪里停下来,然后用“所有”票四处旅行。我可以在一个城市旅行不止一次(这取决于我的机票)。那么,我怎样才能找到一个算法(伪代码)来解决这个tavel问题呢

我想找到起点和终点,但是我不知道如何找到可以使用所有车票的路线。以下是我所做的:

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(城市){
城市==终点城市;
}
}
如果(起始城市==“”&结束城市==“”){
//从任何地方开始,因为这是一个循环。
}否则{
//从起始城市到结束城市排序
}

由于所有票证都定义了起点和目的地,并且要求您使用所有票证,因此您需要查找一个

该路径存在的条件为:

  • 所有边所诱导的图是连通的
  • 除两个节点外,所有节点都有in度=out度,其中一个节点有in度=out度+1,另一个节点有out度=in度+1

  • 中介绍了一种有效的算法。

    迭代您的
    车票列表
    ,构建一个
    目的地集
    。构建一个连接唯一目的地的图表。尝试将边缘最小化,以降低成本(通常是行驶距离)。这通常被称为@ElliottFrisch:实际上,这个问题比TSP简单得多。我们被要求每张票使用一次,而不是每个城市只访问一次。@EyalSchneider嗨。我已经通读了你和我分享的算法。我有一个问题,不是一次删除一个邻接,而是一次循环删除所有邻接,然后在堆栈中添加所有邻接?非常感谢。你好我已经通读了你和我分享的算法。我有一个问题,不是一次删除一个邻接,而是一次循环删除所有邻接,然后在堆栈中添加所有邻接?谢谢@贾豪才:你说的“全部删除”是什么意思?您仍然需要在每一步测试您是否处于“死胡同”,或者您可以继续某些路径。此外,当从堆栈中删除时,不能假设可以从堆栈中删除完整的路径;你可能有一把叉子要检查。把它想象成一个DFS。