亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? yentopkshortestpathsalg.java

?? K-shortest算法實現
?? JAVA
字號:
/*
 *
 * Copyright (c) 2004-2008 Arizona State University.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY ARIZONA STATE UNIVERSITY ``AS IS'' AND
 * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL ARIZONA STATE UNIVERSITY
 * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

package edu.asu.emit.qyan.alg.control;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.Vector;

import edu.asu.emit.qyan.alg.model.Graph;
import edu.asu.emit.qyan.alg.model.Pair;
import edu.asu.emit.qyan.alg.model.Path;
import edu.asu.emit.qyan.alg.model.VariableGraph;
import edu.asu.emit.qyan.alg.model.abstracts.BaseGraph;
import edu.asu.emit.qyan.alg.model.abstracts.BaseVertex;

/**
 * @author <a href='mailto:Yan.Qi@asu.edu'>Yan Qi</a>
 * @version $Revision: 468 $
 * @latest $Id: YenTopKShortestPathsAlg.java 468 2008-08-24 00:03:39Z qyan $
 */
public class YenTopKShortestPathsAlg
{
	private VariableGraph _graph = null;

	// intermediate variables
	List<Path> _result_list = new Vector<Path>();
	Map<Path, BaseVertex> _path_derivation_vertex_index = new HashMap<Path, BaseVertex>();
	Set<Path> _path_candidates = new TreeSet<Path>();
	
	/**
	 * Default constructor.
	 * 
	 * @param graph
	 * @param k
	 */
	public YenTopKShortestPathsAlg(BaseGraph graph)
	{
		this._graph = new VariableGraph((Graph)graph);
	}
	
	/**
	 * Clear the variables of the class. 
	 */
	public void clear()
	{
		_path_candidates.clear();
		//_resulting_path_derivation_vertex_list.clear();
		_path_derivation_vertex_index.clear();
		_result_list.clear();
	}
	
	/**
	 * 
	 * @param source
	 * @param sink
	 * @param top_k
	 * @return
	 */
	public List<Path> get_shortest_paths(BaseVertex source_vertex, 
			BaseVertex target_vertex, int top_k)
	{
		DijkstraShortestPathAlg dijkstra_alg = new DijkstraShortestPathAlg(_graph);
		//1. achieve the shortest path in the graph from source to target
		Path shortest_path = dijkstra_alg.get_shortest_path(source_vertex, target_vertex);
		
		//2. initialize the variables
		clear();
		int count = 0;
		_path_candidates.add(shortest_path);
		_path_derivation_vertex_index.put(shortest_path, source_vertex);
		//_resulting_path_derivation_vertex_list.add(shortest_path.get_vertices().get(0));
		
		//3. main loop of the algorithm
		while(!_path_candidates.isEmpty() && count < top_k)
		{
			//3.1 prepare for removing vertices and arcs
			Path cur_path = _path_candidates.iterator().next();
			_path_candidates.remove(cur_path);
			_result_list.add(cur_path);
			//System.out.println("Result "+count+" : "+cur_path);
			//BaseVertex cur_derivation = _resulting_path_derivation_vertex_list.get(count);
			BaseVertex cur_derivation = _path_derivation_vertex_index.get(cur_path);
			
			++count;
			
			//3.2 remove the vertices and arcs in the graph
			Set<BaseVertex> vertex_check_set = new HashSet<BaseVertex>();
			for(int i=0; i<count-1; ++i)
			{
				BaseVertex cur_deviation_vertex = 
					_path_derivation_vertex_index.get(_result_list.get(i));
				if(vertex_check_set.contains(cur_deviation_vertex))
				{
					continue;
				}
				vertex_check_set.add(cur_deviation_vertex);
				Set<BaseVertex> succ_vertex_set = 
					_graph.get_adjacent_vertices(cur_deviation_vertex);
				for(BaseVertex cur_succ_vertex : succ_vertex_set)
				{
					_graph.remove_edge(new Pair<Integer,Integer>(
							cur_deviation_vertex.get_id(), cur_succ_vertex.get_id()));
				}
			}
			
			int path_length = cur_path.get_vertices().size();
			List<BaseVertex> cur_path_vertex_list = cur_path.get_vertices();
			for(int i=0; i<path_length-1; ++i)
			{
				_graph.remove_vertex(cur_path_vertex_list.get(i).get_id());
				_graph.remove_edge(new Pair<Integer,Integer>(
						cur_path_vertex_list.get(i).get_id(), 
						cur_path_vertex_list.get(i+1).get_id()));
			}
			
			//3.3 calculate the shortest tree rooted at target vertex in the graph
			DijkstraShortestPathAlg reverse_tree = new DijkstraShortestPathAlg(_graph);
			reverse_tree.get_shortest_path_flower(target_vertex);
			
			//3.4 recover the deleted vertices and update the cost and identify the new candidate results
			boolean is_done = false;
			for(int i=path_length-2; i>=0 && !is_done; --i)
			{
				//3.4.1 get the vertex to be recovered
				BaseVertex cur_recover_vertex = cur_path_vertex_list.get(i);			
				_graph.recover_removed_vertex(cur_recover_vertex.get_id());
				
				//3.4.2 check if we should stop continuing in the next iteration
				if(cur_recover_vertex.get_id() == cur_derivation.get_id()) 
				{
					is_done = true;
				}
				
				//3.4.3 calculate cost using forward star form
				Path sub_path = reverse_tree.update_cost_forward(cur_recover_vertex);
				
				//3.4.4 get one candidate result if possible
				if(sub_path != null) 
				{
					//3.4.4.1 get the prefix from the concerned path
					double cost = 0; 
					List<BaseVertex> pre_path_list = new Vector<BaseVertex>();
					reverse_tree.correct_cost_backward(cur_recover_vertex);
					
					for(int j=0; j<path_length; ++j)
					{
						BaseVertex cur_vertex = cur_path_vertex_list.get(j);
						if(cur_vertex.get_id() == cur_recover_vertex.get_id())
						{
							j=path_length;
						}else
						{
							cost += _graph.get_edge_weight_of_graph(cur_path_vertex_list.get(j), 
									cur_path_vertex_list.get(j+1));
							pre_path_list.add(cur_vertex);
						}
					}
					pre_path_list.addAll(sub_path.get_vertices());

					//3.4.4.2 compose a candidate
					sub_path.set_weight(cost+sub_path.get_weight());
					sub_path.get_vertices().clear();
					sub_path.get_vertices().addAll(pre_path_list);
					
					//3.4.4.3 put it in the candidate pool if new
					if(!_path_derivation_vertex_index.containsKey(sub_path))
					{
						_path_candidates.add(sub_path);
						_path_derivation_vertex_index.put(sub_path, cur_recover_vertex);
					}
				}
				
				//3.4.5 restore the edge
				BaseVertex succ_vertex = cur_path_vertex_list.get(i+1); 
				_graph.recover_removed_edge(new Pair<Integer, Integer>(
						cur_recover_vertex.get_id(), succ_vertex.get_id()));
				
				//3.4.6 update cost if necessary
				double cost_1 = _graph.get_edge_weight(cur_recover_vertex, succ_vertex) 
					+ reverse_tree.get_start_vertex_distance_index().get(succ_vertex);
				
				if(reverse_tree.get_start_vertex_distance_index().get(cur_recover_vertex) >  cost_1)
				{
					reverse_tree.get_start_vertex_distance_index().put(cur_recover_vertex, cost_1);
					reverse_tree.get_predecessor_index().put(cur_recover_vertex, succ_vertex);
					reverse_tree.correct_cost_backward(cur_recover_vertex);
				}
			}
			
			//3.5 restore everything
			_graph.recover_removed_edges();
			_graph.recover_removed_vertices();
		}
		
		return _result_list;
	}
	
	/**
	 * Return the list of results generated on the whole.
	 * (Note that some of them are duplicates)
	 * @return
	 */
	public List<Path> get_result_list()
	{
		return _result_list;
	}

	/**
	 * The number of distinct candidates generated on the whole. 
	 * @return
	 */
	public int get_cadidate_size()
	{
		return _path_derivation_vertex_index.size();
	}

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
奇米一区二区三区av| 亚洲一区二三区| 91精品福利在线| 国产一区视频在线看| 中文字幕一区av| 日韩欧美资源站| 91亚洲精品一区二区乱码| 亚洲激情五月婷婷| 国产三级精品三级| 欧美精品99久久久**| 波波电影院一区二区三区| 日韩综合小视频| 亚洲欧美日韩在线| 欧美精品一区二区久久婷婷| a亚洲天堂av| 国产成人三级在线观看| 日韩国产精品久久久久久亚洲| 欧美高清在线精品一区| 在线成人免费视频| 91福利在线导航| 国产精品一二三四区| 伊人性伊人情综合网| 综合在线观看色| 欧美xxxx老人做受| 欧美一区二区三区思思人| 91亚洲国产成人精品一区二区三| 精品亚洲成a人| 亚洲国产一区二区三区| 国产精品日产欧美久久久久| 国产嫩草影院久久久久| 精品少妇一区二区三区在线视频| 欧美一区二区国产| 欧美性生交片4| 成人免费视频播放| 久久99精品国产.久久久久| 亚洲国产一区在线观看| 婷婷国产在线综合| 亚洲最大成人网4388xx| 亚洲一区二区四区蜜桃| 另类专区欧美蜜桃臀第一页| 一区二区三区免费看视频| 亚洲欧美一区二区三区久本道91| 国产欧美日韩不卡免费| 中文字幕乱码亚洲精品一区| 国产天堂亚洲国产碰碰| 欧美大片在线观看一区| 欧美一级二级三级蜜桃| 日韩午夜激情视频| 久久久综合精品| 久久久久久久久99精品| 国产精品午夜春色av| 国产欧美日韩麻豆91| 精品福利一二区| 久久精品免费在线观看| 欧美日韩电影在线| 日韩欧美成人一区| 精品福利在线导航| 国产精品久久久久久久久搜平片 | 国产成+人+日韩+欧美+亚洲| 国产精品夜夜嗨| 成人免费毛片高清视频| 91丨九色丨蝌蚪富婆spa| 色老汉av一区二区三区| 在线观看一区日韩| 日韩欧美国产电影| 国产午夜亚洲精品羞羞网站| 亚洲人成精品久久久久久| 亚洲免费在线观看| 亚洲成人在线观看视频| 青青草国产成人99久久| 国产99久久久精品| 9人人澡人人爽人人精品| 国产真实乱子伦精品视频| av成人免费在线| 欧美日韩电影一区| 久久精品一区二区三区四区| 中文字幕精品综合| 亚洲3atv精品一区二区三区| 麻豆精品久久久| 成人国产精品免费| 色香蕉成人二区免费| 在线一区二区观看| 精品国内二区三区| 国产亚洲精品7777| 五月婷婷综合网| 日韩黄色片在线观看| 国产黄色精品视频| 一本大道久久a久久综合| 2014亚洲片线观看视频免费| 中文字幕在线一区| 老司机精品视频一区二区三区| 国产大陆亚洲精品国产| 欧美一区二区在线看| 国产亚洲成av人在线观看导航| 亚洲aaa精品| 成人午夜激情片| 日韩亚洲国产中文字幕欧美| 欧美国产精品一区二区| 亚洲国产成人porn| 99久久精品免费看国产免费软件| 欧美日韩国产一级片| 国产精品美女一区二区在线观看| 日韩在线播放一区二区| 色婷婷精品大视频在线蜜桃视频 | 欧洲视频一区二区| 色偷偷久久人人79超碰人人澡 | 国产精品亚洲第一区在线暖暖韩国| 色综合中文字幕国产| 欧美一级精品在线| 亚洲综合在线电影| 国产成人免费在线观看不卡| 日韩免费性生活视频播放| 亚洲精品videosex极品| 狠狠色丁香久久婷婷综| 欧美亚洲国产一区二区三区va | 欧美日韩精品一区二区天天拍小说 | 欧美日精品一区视频| 久久亚洲综合av| 欧美aaa在线| 在线亚洲精品福利网址导航| 国产精品精品国产色婷婷| 老司机一区二区| 日韩欧美你懂的| 亚洲在线视频一区| 日本精品一级二级| 中文字幕免费不卡| 国产91精品入口| 久久久99精品免费观看不卡| 夜夜精品视频一区二区| 色婷婷激情综合| 亚洲婷婷在线视频| 95精品视频在线| 国产精品麻豆网站| 99re成人精品视频| 亚洲国产高清aⅴ视频| 国产一区二区精品久久99 | 中文字幕在线观看不卡| 国产精品99久久久久久宅男| 日韩一卡二卡三卡国产欧美| 日韩在线一区二区三区| 欧美精品18+| 免费观看91视频大全| 69av一区二区三区| 久久99这里只有精品| 日韩欧美电影一二三| 国产精品一区二区不卡| 成人午夜精品在线| 色狠狠色噜噜噜综合网| 亚洲天堂av老司机| 国产精品一二三在| 国产精品久久久久影院色老大| 久久99精品网久久| 中文一区一区三区高中清不卡| 国产精品中文有码| 亚洲欧美日韩精品久久久久| 99久久99久久免费精品蜜臀| 一区二区三区在线看| 在线观看区一区二| 奇米777欧美一区二区| 91精品久久久久久久99蜜桃| 狠狠色丁香婷婷综合久久片| 久久精品欧美一区二区三区不卡| 成人国产精品视频| 亚洲乱码国产乱码精品精98午夜 | 全国精品久久少妇| 久久久不卡网国产精品一区| 国产精品一线二线三线精华| 久久亚洲欧美国产精品乐播| 91在线视频播放地址| 亚洲精品欧美专区| 日韩欧美中文字幕精品| 国产在线播放一区二区三区 | 国产欧美视频一区二区| 99久久久国产精品| 天堂久久久久va久久久久| 久久婷婷国产综合精品青草| av一区二区三区黑人| 天天av天天翘天天综合网| 欧美成人性福生活免费看| 国产精品影视在线观看| 中文字幕一区二区三区不卡在线| 日韩成人一区二区三区在线观看| 国产色产综合色产在线视频| 国产不卡免费视频| 午夜视频在线观看一区二区| 精品理论电影在线观看| 色偷偷一区二区三区| 蜜臀精品一区二区三区在线观看 | 国产永久精品大片wwwapp| 亚洲欧美日韩国产成人精品影院| 在线综合视频播放| 91视频免费观看| 精品影院一区二区久久久| 亚洲精品综合在线| 精品欧美一区二区久久| 欧美日韩一区二区电影| 成人午夜视频在线| 狠狠色丁香久久婷婷综| 亚洲国产精品一区二区www| 中文字幕中文字幕在线一区 |