C语言编写Dijkstra算法及生成图

日常发代码备份,用VS写的C。。。hhh感觉以后还是拿VC写吧,VS大材小用心塞得很,毕竟不会其他语言小白一个:)不过这次还是有点不一样。。。在写生成结果,也就是想用生成有向图的方式写输出结果的时候感觉没有思路。。。请问有会这个的吗?给点建议?

#define INF 1000000
#define MAXN 20   //顶点个数的最大值
#include
#include
#include
#include
int n;
int Edge[MAXN][MAXN];   //邻接矩阵
int S[MAXN];
int dist[MAXN];
int path[MAXN];
void Dijkstra(int v0)
{
    int i, j, k;
    for(i=0;i0;
        if (i != v0 &&dist[i] < INF)
            path[i] = v0;
        else path[i] = -1;
    }
    S[v0] = 1;
    dist[v0] = 0;   //v0加入顶点集合S
    for (i = 0; i < n - 1; i++)
    {
        int min = INF, u = v0;   //选择当前集合T中具有最短路径的顶点u
        for (j = 0; j < n; j++)
        {
            if (!S[j] && dist[j] < min)
            {
                u = j; min = dist[j];
            }
        }
        S[u] = 1;   //u加入S,表示其最短路径已求得
        //修改T集合中顶点的dist和path数组元素值
        for (k = 0; k < n; k++)
        {
            if (!S[k] && Edge[u][k] < INF&&dist[u] + Edge[u][k] < dist[k])
            {
                dist[k] = dist[u] + Edge[u][k];
                path[k] = u;
            }
        }
    }
}
int main()
{
    int i, j;
    int u, v, w;   //边的起点,终点,权值
    scanf_s("%d",&n);   //n为顶点个数
    while (1)
    {
        scanf_s("%d%d%d",&u,&v,&w);  //读入边的起点、终点
        if (u == -1 && v == -1 && w == -1)
            Edge[u][v] = w;
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            if (i == j)
                Edge[i][j] = 0;
            else if (Edge[i][j] == 0)
                Edge[i][j] = INF;
        }
    }
    Dijkstra(0);
    int shortest[MAXN];
    for (i = 1; i < n; i++)
    {
        printf("%d\t",dist[i]);
        //以下代码用于输出顶点0到顶点的最短路径
        memset(shortest, 0, sizeof(shortest));
        int k = 0;   //k是shortest数组中最后一个元素的下标
        shortest[k] = i;
        while (path[shortest[k]]!=0)
        {
            k++;
            shortest[k] = path[shortest[k - 1]];
        }
        k++;
        shortest[k] = 0;
        for (j = k; j > 0; j--)
            printf("%d->", shortest[j]);
        printf("%d\n", shortest[0]);
    }
    return 0;
}
#include"stdafx.h"

你可能感兴趣的:(算法,杂记)