您的位置:首页 > 其它

最短路径之 Dijkstra的优化

2014-07-31 09:04 337 查看
Dijkstra算法利用了优先队列,也用到了静态邻接表。主要也是有两部分组成。一: 当然是初始化。将dist和pre分别赋值,然后输入各条边的信息,存储在静态邻接表中 。二: 中Dijkstra中 将Q.push(temp) .然后利用for(i =pre[nod] ; i != -1 ;i = edge[i].next)将每条与temp有关联的边进行遍历。能松弛的点push到Q中。详细看下面的代码。

<span style="font-size:18px;">#include
#include
#include
#include
#include

using namespace std ;

#define MAXN 1000
#define INF 1000000

int map[MAXN][MAXN] ;
int visit[MAXN] ;
int pre[MAXN] ;
int dist[MAXN] ;
int path[MAXN] ;
int top ;

struct node{

int p ;
int value ;

friend bool operator < (node a , node b ){

return a.value > b.value ;
}
};

priority_queue Q ;

struct Edge
{
int to ;
int w ;
int next ;

}edge[MAXN*MAXN];

void addedge(int x ,int y , int w )
{
edge[top].to = y ;
edge[top].w = w ;
edge[top].next = pre[x] ;
pre[x] = top ;
top++ ;
}

void init (int n, int m)
{
int i , j ;
top = 1 ;

memset(pre , -1 ,sizeof(pre)) ;
for(i = 1 ;i <= n ; i++)
dist[i] = INF ;
dist[1] = 0 ;
for(i = 1 ;i <= n ; i++){
for(j = 1 ;j <= n ; j++){
map[i][j] = INF ;

}
}

for(i = 1 ;i <= m ; i++){
int x ,y , w ;
scanf("%d%d%d" ,&x ,&y , &w) ;
if(map[x][y] < w) continue ;
addedge(x,y,w) ;
addedge(y,x,w) ;
map[x][y] = map[y][x] = w ;

}
}

void Dijkstra (int  n )
{
memset(visit , 0 ,sizeof(visit)) ;
node temp ;

while(!Q.empty()) Q.pop() ;

temp.p = 1 ;
temp.value = 0 ;
Q.push(temp) ;

path[1] = -1 ;

while(!Q.empty())
{
temp = Q.top() ;
Q.pop() ;

int nod = temp.p ;
int w = temp.value ;
if(visit[nod]) continue ;
visit[nod] = 1 ;
int i ;
for(i = pre[nod] ; i != -1 ;i = edge[i].next ){

int    t = edge[i].to ;
if(visit[t]) continue ;

int v = edge[i].w ;

if(dist[nod] + v < dist[t])
{
dist[t] = dist[nod] + v ;

path[t] = nod ;

node next ;
next.p = t ;
next.value = dist[t] ;
Q.push(next) ;
}
}

}

}

int main()
{
int m , n ;
int i , j ;
int ans[MAXN] ;
while(scanf("%d%d" ,&n, &m )!=EOF ){
if(n == 0 && m == 0) break ;
init(n ,m) ;

Dijkstra(n) ;

printf("%d\n",dist
) ;

int t = 0 ;
for(i = n ; i != -1 ; i = path[i]){
ans[t++] = i ;
}
for(i = t-1 ; i >= 0 ; i--){
printf("%d ",ans[i]) ;
}
printf("\n") ;

}

return 0;
}</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐