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 ;
}
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 ;
}
解决方案 »
- 谁帮我举个最简单的delphi三层的数据库操作
- 如何模拟DBGrid组件的Enabled属性,使之变得无效??
- 如何增加明细记录(思路)
- 请问,如何用Delphi的RecordSet对象的Open方法,将XML数据源打开?我有VB的代码,但不会转到Delphi上来,请指教。
- 急!转化一段vc++代码为delphi代码!!!(顶有分)
- 如何隐藏TreeView中的一列
- 用IMAGE做标题栏时,如何设置激活与非激活时显示的图像?
- 同盟们 帮帮忙!
- D2007如何安装Raize 6
- 请教在delphi里把数字(69)转换成字母的函数是什么
- 程序退出后,TOleContainer为什么不能自动关闭进程的winword.exe????
- BDE连接SQL server 2000,出现的一些问题!
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);