最短路径(有向图)

前面写过最短路径的无向图操作,这次是有向图了,想说的是按照以前那个思路保存路径,总是不能按照最短路径实现的

顺序输出,只是保存了相应的路径,却没有按照顺序保存,这次这个程序是别人的代码,拿来吸收了一下路径的保存方法,

突然觉得这个方法实现的Dijsktra比我上次写的简洁的多!!!于是果断学习了,弱菜的成长离不开大神的帮助,在这里

很感谢大神室友!!!把代码贴上来吧,保存着:

Ps:代码和算法都是室友的,学习了……:

/*
  0为源,weight[u,v]为点u和v之间的边的长度,结果保存在dis[]

  初始化:源的距离dis[0]设为0,其他的点距离设为无穷大,同时把所有的点的状态设为没有找到最短路(OK[] = 0)。

循环n-1次:
1 在没有扩展过的点中取一距离最小的点tmp,并将其状态设为已经找到最短路(OK[] = 1)。

2 对于每个与tmp相邻的点k,执行Relax(tmp,k),也就是说,如果dis[tmp]+weight[tmp,k]
#include 
#include 

const int IFINITY = 99999999;
const int N = 50;

int main()
{
    int map[N][N], final[N], D[N], parent[N];
    
    //初始化 
    memset(final, 0, sizeof(final));
    memset(parent, -1, sizeof(parent));
    for(int i = 0; i < N; i++)
    {
            D[i] = IFINITY;
            for(int j = 0; j < N; j++)
                    map[i][j] = IFINITY;
            
    }
    D[0] = 0;
    
    int n, m, s, e, w;
    scanf("%d %d", &n, &m);
    for(int i = 0; i < m; i++)
    {
            scanf("%d %d %d", &s, &e, &w);
            map[s][e] = w;
    }
    
    
   	//Dijsktra
    for(int i = 1; i <= n-1; i++)
    {
            int tmp = -1;
            for(int j = 0; j < n; j++)
                    if(final[j] == 0 && (tmp == -1 || D[tmp] > D[j]))
                                tmp = j;
            final[tmp] = 1;
    
            for(int k = 0; k < n; k++)
                    if(final[k] == 0 && map[tmp][k] != IFINITY && D[tmp] + map[tmp][k] < D[k])
                    {
                                D[k] = D[tmp] + map[tmp][k];
                                parent[k] = tmp;
                    }
    }
    
    //输出结果 
    for(int i = 1; i < n; i++)
    {
            int tmp = i;
            while(parent[tmp] != -1)
            {
                              printf("v%d\t", tmp);
                              tmp = parent[tmp];
            }
            if(parent[i] != -1)
            {
                         printf("v0\n");
                         printf("v0 to v%d has a shortest distance of %d\n", i, D[i]);
            }
    }
    
    system("pause");
    return 0;
}


你可能感兴趣的:(代码)