91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

C語言怎么實現johnson算法

小億
85
2023-11-25 05:12:21
欄目: 編程語言

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算法,在輸入圖的鄰接矩陣后,根據起始頂點計算出圖中各頂點的最短路徑。

0
通化县| 靖江市| 太湖县| 噶尔县| 东乡| 太白县| 西充县| 留坝县| 湖北省| 吉林市| 房产| 济宁市| 平南县| 金山区| 石楼县| 广州市| 车险| 浏阳市| 吐鲁番市| 金寨县| 宕昌县| 饶河县| 驻马店市| 清镇市| 合作市| 敦煌市| 紫云| 高雄县| 吴堡县| 大方县| 来宾市| 缙云县| 保定市| 河间市| 梁河县| 德保县| 丹东市| 师宗县| 义乌市| 揭阳市| 建阳市|