#include <iostream>
#include <cstring>
#include <queue>
#include <fstream>
using namespace std;
#define E 100005
#define V 1005
#define INF 1 << 30
int heads[V], r_heads[V];
int dists[V];
bool visits[V];
int nEdgeNum, nNodeNum, nEdgeCount;
int nEnd, nSrc, k;
struct Edge{
int to_node;
int next_edge;
int edge_weight;
int r_to_node;
int r_next_edge;
Edge(){}
Edge( int from, int to, int weight ){
to_node = to;
r_to_node = from;
edge_weight = weight;
}
}edges[E];
struct Node{
int v;
int src_to_v_dist;
Node(){
this->v = 0;
this->src_to_v_dist = 0;
}
Node( int v, int d ){
this->v = v;
this->src_to_v_dist = d;
}
bool operator < ( const Node& other ) const{
return src_to_v_dist + dists[v] > dists[other.v] + other.src_to_v_dist;
}
};
void addEdge( int from, int to, int dist ){
edges[nEdgeCount] = Edge( from, to, dist );
edges[nEdgeCount].r_next_edge = r_heads[to];
edges[nEdgeCount].next_edge = heads[from];
heads[from] = nEdgeCount;
r_heads[to] = nEdgeCount;
nEdgeCount++;
}
void dijkstra( int src ){
priority_queue< Node > que;
for( int i = 1; i <= nNodeNum; ++i )
dists[i] = INF;
dists[src] = 0;
que.push( Node( src, 0 ) );
while( !que.empty() ){
Node cur = que.top();
que.pop();
if( visits[cur.v] )
continue;
visits[cur.v] = true;
for( int i = r_heads[cur.v]; ~i; i = edges[i].r_next_edge ){
if( dists[edges[i].r_to_node] > dists[cur.v] + edges[i].edge_weight ){
dists[edges[i].r_to_node] = dists[cur.v] + edges[i].edge_weight;
que.push( Node( edges[i].r_to_node, 0 ) );
}
}
}
}
int AStar( int src ){
priority_queue< Node > que;
que.push( Node( src, 0 ) );
while( !que.empty() ){
Node cur = que.top();
que.pop();
if( cur.v == nEnd ){
if( k > 1 )
k--;
else
return cur.src_to_v_dist;
}
for( int i = heads[cur.v]; ~i; i = edges[i].next_edge )
que.push( Node( edges[i].to_node, cur.src_to_v_dist + edges[i].edge_weight ) );
}
return -1;
}
void init(){
memset( visits, false, sizeof( visits ) );
memset( heads, -1, sizeof( heads ) );
memset( r_heads, -1, sizeof( r_heads ) );
nEdgeCount = 0;
}
int main(){
//fstream fin( "t.txt" );
while( cin >> nNodeNum >> nEdgeNum ){
init();
for( int i = 1; i <= nEdgeNum; ++i ){
int from, to, dist;
cin >> from >> to >> dist;
addEdge( from, to, dist );
}
cin >> nSrc >> nEnd >> k;
dijkstra( nEnd );
if( dists[nSrc] == INF ){
cout << "-1\n";
continue;
}
if( nSrc == nEnd )
k++;
int ans = AStar( nSrc );
cout << ans << endl;
}
return 0;
}
POJ 2449 Remmarguts' Date ( Dijkstra + A* 求解第K短路 )
原文地址:http://blog.csdn.net/pandora_madara/article/details/40324725