Dijkstra

d[i]——从源点到 i点的最短距离
f[i]——i的父节点
p[i]——标记i的最短路是否确定:0 不确定;1 确定
d[]置无穷大

d[s]=0;
for (k=1;k<=n;k++){
    min
=∞;
   
for (j=1;j<=n;j++)
       
if (p[j]==0 && d[j]<min){
            min
=d[j]; i=j;
        }
   
if (min=∞) break;
   
    p
=1;
   
for (j=1;j<=n;j++)
       
if (p[j]==0 && g[i][j]>0 && d[i]+s[i][j]<d[j]){
            d[j]
=d[i]+g[i][j];
            f[j]
=i;
        }
}

 

08.8.17(在学校学dijkstra)


#include
<stdio.h>
   
long i,j,k,m,n;
   
long dist[101],vis[101];
   
long w[101][101];
   
long s,t;
void init(){
   
long x,y,z;
    scanf(
"%ld%ld",&n,&m);
   
for (i=1;i<=n;i++)
       
for(j=1;j<=n;j++)
            w[i][j]
=100000000;
    
for(i=1;i<=n;i++){
        dist[i]
=100000000;    
        vis[i]
=1;
     }
    
for(i=1;i<=m;i++){
         scanf(
"%ld%ld%ld",&x,&y,&z);                 
         w[x][y]
=z;w[y][x]=z;
     }
     scanf(
"%ld%ld",&s,&t);         
}
void work(){
   
long min;
    dist[s]
=0;
   
do{
        min
=100000000;
        k
=0;
       
for(i=1;i<=n;i++)
         
if(vis[i]==1 && dist[i]<min){
              min
=dist[i];
              k
=i;            
        }
       
if(k==0)break;
        vis[k]
=0;
       
       
for(i=1;i<=n;i++)
           
if(dist[i]>(min+w[k][i]))
                dist[i]
=min+w[k][i];
    }
while(true);   
}
void out(){
    printf(
"%ld",dist[t]);
}
main(){
    freopen(
"dijkstra.in","r",stdin);
    freopen(
"dijkstra.out","w",stdout);
        init();
        work();
       
out();                            
   
return 0;
}

posted @ 2009-11-01 13:52  末日凌晨 散步的猫 ##  阅读(216)  评论(0编辑  收藏  举报