首页主机资讯C语言怎么实现johnson算法

C语言怎么实现johnson算法

时间2023-12-09 11:16:03发布访客分类主机资讯浏览891
导读:Johnson算法是一种用于解决有向图最短路径问题的算法。它的基本思想是通过对图进行转换,将原图中的负权边转换为非负权边,然后利用Dijkstra算法或Bellman-Ford算法求解最短路径。 以下是使用C语言实现Johnson算法的基本...

Johnson算法是一种用于解决有向图最短路径问题的算法。它的基本思想是通过对图进行转换,将原图中的负权边转换为非负权边,然后利用Dijkstra算法或Bellman-Ford算法求解最短路径。

以下是使用C语言实现Johnson算法的基本步骤:

  1. 定义图的数据结构,包括顶点数量和边的权重信息。
#define MAX_VERTEX 100
#define INF 9999

int graph[MAX_VERTEX][MAX_VERTEX];

  1. 实现Bellman-Ford算法,用于对图进行转换。
void bellmanFord(int V, int start)
{
    
    int dist[V];
    
    for (int i = 0;
     i  V;
     i++)
        dist[i] = INF;
    
    dist[start] = 0;
    

    for (int i = 0;
     i  V - 1;
 i++)
    {
    
        for (int u = 0;
     u  V;
 u++)
        {
    
            for (int v = 0;
     v  V;
 v++)
            {
    
                if (graph[u][v] != 0 &
    &
     dist[u] + graph[u][v]  dist[v])
                    dist[v] = dist[u] + graph[u][v];

            }

        }

    }
    

    for (int u = 0;
     u  V;
 u++)
    {
    
        for (int v = 0;
     v  V;
 v++)
        {
    
            if (graph[u][v] != 0 &
    &
     dist[u] + graph[u][v]  dist[v])
                printf("图中存在负权环,无法计算最短路径");

        }

    }
    

    // 将负权边转换为非负权边
    for (int u = 0;
     u  V;
 u++)
    {
    
        for (int v = 0;
     v  V;
 v++)
        {
    
            if (graph[u][v] != 0)
                graph[u][v] += dist[u] - dist[v];

        }

    }

}

  1. 实现Dijkstra算法,用于求解转换后图的最短路径。
void dijkstra(int V, int start)
{
    
    int dist[V];
    
    bool visited[V];
    

    for (int i = 0;
     i  V;
 i++)
    {
    
        dist[i] = INF;
    
        visited[i] = false;

    }
    
    dist[start] = 0;
    

    for (int count = 0;
     count  V - 1;
 count++)
    {
    
        int u = -1;
    
        for (int i = 0;
     i  V;
 i++)
        {
    
            if (!visited[i] &
    &
     (u == -1 || dist[i]  dist[u]))
                u = i;

        }
    

        visited[u] = true;
    

        for (int v = 0;
     v  V;
 v++)
        {
    
            if (!visited[v] &
    &
     graph[u][v] != 0 &
    &
     dist[u] != INF &
    &
     dist[u] + graph[u][v]  dist[v])
                dist[v] = dist[u] + graph[u][v];

        }

    }
    

    printf("顶点   最短路径\n");
    
    for (int i = 0;
     i  V;
 i++)
    {
    
        if (dist[i] == INF)
            printf("%d \t 无限远\n", i);
    
        else
            printf("%d \t %d\n", i, dist[i]);

    }

}

  1. 主函数中调用上述函数来实现Johnson算法。
int main()
{
    
    int V;
    
    int start;
    
    printf("输入顶点数量:");
    
    scanf("%d", &
    V);
    
    printf("输入起始顶点:");
    
    scanf("%d", &
    start);
    

    printf("输入图的邻接矩阵:\n");
    
    for (int i = 0;
     i  V;
 i++)
    {
    
        for (int j = 0;
     j  V;
 j++)
        {
    
            scanf("%d", &
    graph[i][j]);

        }

    }
    

    bellmanFord(V, start);
    
    dijkstra(V, start);
    

    return 0;

}
    

上述代码实现了Johnson算法,在输入图的邻接矩阵后,根据起始顶点计算出图中各顶点的最短路径。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: C语言怎么实现johnson算法
本文地址: https://pptw.com/jishu/574619.html
c语言加密程序如何写 ASP.NET中enableeventvalidation问题怎么解决

游客 回复需填写必要信息