ACM模板 dijkstra,最短路径

吉林大学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;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值