单源最短路径 C++实现 调试通过

 问题描述:给定带权有向图G=(V,E), 其中每条边的权是一个非负实数.要计算从V的一点v0(源)到所有其他各顶点的最短路长度. 路长指路上各边权之和。 

图中1为源点,求出它到其他各点的最短路径,用数组存储此图,

    /*初始化有向图*/

    int c[6][6];

    int i,j;

    //int maxint=1000;

    for(i=0;i<6;i++)

    {

        for(j=0;j<6;j++ )

        {

            c[i][j]=maxint;

        }

    }

    c[1][2]=10;

    c[1][4]=30;

    c[1][5]=100;

    c[2][3]=50;

    c[3][5]=10;

    c[4][3]=20;

    c[4][5]=60;

其中maxint是比最大的权还大的数,用maxint代替数组中没有有向边的两点的权值,而不能用0代替,因为我们要求最短的路径,用0影响查找

#include  " stdafx.h "
#include
< cstdio >
#include 
< iostream >
using   namespace  std;
const   int  maxint = 1000 ;
void  Dijkstra( int  n,  int  v, int  dist[],  int  prev[],  int  c[][ 6 ])     // n为点数量,v为起始点,dist数组存储选择的边的权,prev[i]代表i点前一顶点,c为有向图数组
  {
    
bool s[100];
    
for (int i=1;i<=n; i++)
    
{
       dist[i]
=c[v][i];
       s[i]
=false;
       
if(dist[i]==maxint) 
       
{  
           prev[i]
=0;
       }

       
else 
       
{
           prev[i]
=v ;
       }

    }

    dist[v]
=0;
    s[v]
=true;
    
for (int i=1;i<n;i++)
    
{    
       
int temp=maxint;
       
int u= v;    
       
for (int j = 2;j<=n;j++)

          
if ((!s[j])&&(dist[j]<temp))
          
{        
             u
=j;
             temp
=dist[j];
          }
    
          s[u]
=true;

     
for (int j=2;j<=n;j++)  

     
if((!s[j])&&(c[u][j]<maxint))
     
{
         
int newdist=dist[u]+c[u][j];
         
if (newdist<dist[j])
         
{
           dist[j]
=newdist;
           prev[j]
=u; 
         }

     }

    }

     
/*输出从原点到其他顶点之间的最短路径长度*/
    cout
<<"输出从原点到其他顶点之间的最短路径长度"<<endl;
    
for(int j=2;j<6;j++)
    
{
        cout
<<"dist["<<j<<"]"<<":"<<dist[j]<<endl;
    }

    
/*输出所选的边*/
    cout
<<"输出所选的边"<<endl;
    
for(int t=2;t<6;t++)
    
{
        cout
<<prev[t]<<"->"<<t<<endl;
    }

}


int  main()
{
    
/*初始化有向图*/
    
int c[6][6];
    
int i,j;
    
//int maxint=1000;
    for(i=0;i<6;i++)
    
{
        
for(j=0;j<6;j++    )
        
{
            c[i][j]
=maxint;
        }

    }

    c[
1][2]=10;
    c[
1][4]=30;
    c[
1][5]=100;
    c[
2][3]=50;
    c[
3][5]=10;
    c[
4][3]=20;
    c[
4][5]=60;
    
    cout
<<"有向图矩阵如下:代表两点之间无有向边"<<endl;
    
for(i=1;i<6;i++)
    
{
        
for(j=1;j<6;j++    )
        
{
            cout
<<c[i][j]<<"  ";
        }

        cout
<<endl;
    }

    
int dist[6];
    
int prev[6];
    
int n=5;
    
int v=1;
    Dijkstra(n,v,dist,prev,c);
    
return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值