const int MaxInt = 0x7fffffff ;
const int N = 110 ;
//不连通的地方用MaxInt填充
//n:顶点数  v:起始点  dist[i]: v到i点的最小距离  pre[i]:i的前趋点
int Dijkstra( int m[][N] , int n , int v , int dist[] , int pre[] ) 
{
    int i , j , min , u , s[ N ] ;
    for( i=0 ; i<n ; i++ )
    {
        dist[ i ] = m[ v ][ i ] ;
        s[ i ] = 0 ;
        pre[ i ] = dist[ i ] < MaxInt ? v : 0 ;
    }
    s[ v ] = 1 ;
    pre[ v ] = 0 ;
    for( i=0 ; i<n-1 ; i++ )
    {
        min = MaxInt ;            //  在 V-S 中选U,使dist[u]为最短
        u = -1 ;
        for( j=0 ; j<n ; j++ )
        {
            if ( s[ j ] == 0 )    //j 属于V-S
            {
                if ( dist[ j ] != 0 && dist[ j ] < min )
                {
                    min = dist[ j ] ;
                    u = j ;
                }
            }
        }
        if ( u == -1 ) return 0 ; //不连通的图
        s[ u ] = 1 ;              //将顶点U加入到集合S中
        for( j=0 ; j<n ; j++ )
            if ( s[ j ] == 0 && m[ u ][ j ] < MaxInt )
                if ( dist[ j ] > dist[ u ] + m[ u ][ j ] )
                {
                    dist[ j ] = dist[ u ] + m[ u ][ j ] ;
                    pre[ j ] = u ;
                }
    }
    return 1 ;
}

解决方案 »

  1.   

    const  MaxInt = $7fffffff ;
    const NN :integer = 110 ;function Dijkstra(var m:Variant;n,v:integer;
      var dist:array of integer;
      var pre:array of integer):integer;var i,j,min,u:integer;
        s:array of integer;
    begin
      setLength(s,NN);
      for i:=0 to n-1 do
      begin
        dist[i] := m[v][i] ;
        s[i] := 0 ;
        if  dist[i]< MaxInt then pre[i]:=v else pre[i]:=0;
      end;  s[v] := 1 ;
      pre[v] := 0 ;
      for i:=0 to n-2 do
      begin
        min := MaxInt ;            //  在 V-S 中选U,使dist[u]为最短
        u := -1 ;
        for j:=0 to n-1 do
        begin
          if ( s[j] = 0 )then    //j 属于V-S
          begin
            if ( dist[j] <> 0) and (dist[j] < min )then
            begin
                min := dist[j] ;
                u := j ;
            end;
          end;
        end;
        if ( u = -1 )then
        begin
          result := 0 ; //不连通的图
          exit;
        end;
        s[u] := 1 ;              //将顶点U加入到集合S中
            for  j:=0  to n-1 do
                if ( s[j] = 0 )and( m[u][j] < MaxInt )then
                    if ( dist[j] > dist[u] + m[u][j] )then
                    begin
                        dist[j] := dist[u] + m[u][j] ;
                        pre[j] := u ;
                    end;
      end;  result:= 1 ;
    end;====================================================
    调用函数的地方用类似下面方法设置Variant:
       var ary :Variant;
      ary:=VarArrayCreate([0,m,0,m], varVariant);