最短路算法(dijkstra)

#include<iostream>
using namespace std;


int edgs[100][100];     //边 
int dist[MAXNUM];        //v0到各边的值
int prev[MAXNUM];       //前驱数组 

void Dijkstra(int v0,int n)
{
    bool S[MAXNUM];        //确定顶点是否在S集合中 
     
     for(int i=0;i<n;i++)
     {
         dist[i]=edgs[v0][i];    //vo到个点的初值
         S[i]=false;         //所有节点未加入S
         if(dist[i] ==MAXINT)
         {
             prev[i]=-1;     //没有前驱节点 
         }
         else
             prev[i]=v0; 
     } 
     
     dist[v0] =0;
     S[v0]=true;
     /*
     求v到v0的最短距离,将v加到S集中 
     */ 
     for(int i=1;i<n;i++)
     {
         int min    =MAXINT;
         int u=v0;
         
         //找到当前未使用点的DISJ[i]最小值 
         for(int j=0;j<n;j++)
         {
             if((!S[j]) && dist[j]<min) 
             {
                 u=j;
                 min=dist[j]; 
             } 
             
            S[u]=true;   //找到最短路径  加入顶点
             
             //以新加入的节点    更新从 v0触发到集合V-S的顶点路径长度
             for(int j=0;j<n;j++)
                 if((!S[j]) && dist[u]+edgs[u][j]<dist[j])    //通过新加入节点找到更短路径 
                 {
                     dist[j]=dist[u]+edgs[u][j];
                     prev[j]=u;     //更新前驱节点 
                 } 
         } 
     } 
} 
int main()
{
    int n;     //图的顶点数
    cin>>n;
     for(int i=0;i<n;i++)
         for(int j=0;j<n;j++)
             cin>>edgs[i][j];     //边的权值
             
      
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值