最短路径Dijkstra

/*=======================================================*\ 
  Dijkstra 数组实现 O(N^2) 
  Dijkstra --- 数组实现(在此基础上可直接改为STL的Queue实现) 
  lowcost[] --- beg到其他点的最近距离 
  path[] -- beg为根展开的树,记录父亲结点 
\*=======================================================*/  
  
#define INF 0x03F3F3F3F  
const int N;  
int path[N], vis[N];  
void Dijkstra(int cost[][N],int lowcost[N],int n,int beg){  
    int i,j,min;  
    memset(vis,0,sizeof(vis));  
    vis[beg] = 1;  
    for (i=0 ; i<n ; i++){  
        lowcost[i] = cost[beg][i];  
        path[i] = beg;  
    }  
    lowcost[beg] = 0;  
    path[beg] = -1;  
    int pre = beg;  
    for(i=1 ; i<n ; i++){  
        min = INF;  
        for(j=0 ; j<n ; j++)  
        //下面的加法可能导致溢出,INF不能取太大  
            if(vis[j]==0 && lowcost[pre]+cost[pre][j]<lowcost[j] ){  
                lowcost[j] = lowcost[pre] + cost[pre][j];  
                path[j] = pre;  
            }  
        for(j=0 ; j<n ; j++)  
            if( vis[j]==0 && lowcost[j]<min ){  
                min = lowcost[j];  
                pre = j;  
            }  
        vis[pre] = 1;  
    }  
}  

 

posted @ 2018-04-19 17:11  LloydDracarys  阅读(84)  评论(0)    收藏  举报