MPI之弗洛伊德最短路徑演算法

2021-08-02 04:22:02 字數 2607 閱讀 2904

#include 

#include

#include /* for debugging */

#include

const

int infinity = 1000000;

void read_matrix(int local_mat, int n, int my_rank, int p,

mpi_comm comm);

void print_matrix(int local_mat, int n, int my_rank, int p,

mpi_comm comm);

void floyd(int local_mat, int n, int my_rank, int p, mpi_comm comm);

int owner(int k, int p, int n);

void copy_row(int local_mat, int n, int p, int row_k, int k);

//void print_row(int local_mat, int n, int my_rank, int i);

int main(int argc, char* argv)

mpi_bcast(&n, 1, mpi_int, 0, comm);

local_mat = malloc(n*n/p*sizeof(int));

if (my_rank == 0) printf("enter the local_matrix\n");

read_matrix(local_mat, n, my_rank, p, comm);

if (my_rank == 0) printf("we got\n");

print_matrix(local_mat, n, my_rank, p, comm);

if (my_rank == 0) printf("\n");

floyd(local_mat, n, my_rank, p, comm);

if (my_rank == 0) printf("the solution is:\n");

print_matrix(local_mat, n, my_rank, p, comm);

free(local_mat);

mpi_finalize();

return

0;} /* main */

void read_matrix(int local_mat, int n, int my_rank, int p,

mpi_comm comm) else

} /* read_matrix */

void print_matrix(int local_mat, int n, int my_rank, int p,

mpi_comm comm)

free(temp_mat);

} else

} /* print_matrix */

void floyd(int local_mat, int n, int my_rank, int p, mpi_comm comm)

}free(row_k);

} /* floyd */

int owner(int k, int p, int n) /* owner */

void copy_row(int local_mat, int n, int p, int row_k, int k) /* copy_row */

二、**實現流程:

(1)程式依據分塊的思想實現,每乙個程序分得乙個鄰接矩陣塊;

(2)每乙個節點都會作為一次支點,支點所在的行會被傳送到每乙個程序;

(3)各程序通過判斷local_mat的距離」 > 「local_mat[i][k]+local_mat[k][j]」更新鄰接矩陣,k是支點;

(4)0號程序收集更新後的鄰接矩陣,即獲得各節點間的最短路徑;

三、核心**:

(1) if (my_rank == 0)

程式開始輸入節點數。

(2)void read_matrix(int local_mat, int n, int my_rank, int p,

mpi_comm comm) else

} 如果是0號程序,鍵入鄰接矩陣,不可達則鍵入較大的數1000000,並向每乙個程序分配鄰接矩陣塊。

(3)void floyd(int local_mat, int n, int my_rank, int p, mpi_comm comm)

} free(row_k);

} /* flo

global_k 是支點所在的行號,支點所在的程序會把支點所在的行傳送給每個程序;每個程序通過比較 temp = local_mat[local_i*n + global_k] + row_k[global_j];

if (temp < local_mat[local_i*n+global_j])

更新各程序的鄰接矩陣。

四、實驗截圖:

【注意】鄰接矩陣中,不可達為較大的數1000000

最短路徑之弗洛伊德

floyd演算法是大二到大三期間集訓時候才算真正接觸的,或許只有前一段時間dp的積累現在才算是真正理解 這個演算法需要充分理解dp的滾動陣列思想才能算是真正的掌握 floyd演算法又稱為插點法 演算法的目標是要求圖中所有兩個點的最短距離,就用dis i j 來表示 但是dis i j 是不夠設定為狀...

弗洛伊德演算法求最短路徑

include includeusing namespace std 鄰接矩陣的型別定義 define max 10000000 define max vertex num 20 typedef struct mgraph 構造有向網的鄰接矩陣 void createdn am mgraph g,i...

最短路徑 弗洛伊德 Floyd 演算法

弗洛伊德 floyd 演算法 是解決任意兩點間的最短路徑的一種演算法 floyd演算法是乙個經典的動態規劃演算法 用通俗的語言來描述的話,首先我們的目標是尋找從點i到點j的最短路徑。從動態規劃的角度看問題,我們需要為這個目標重新做乙個詮釋 這個詮釋正是動態規劃最富創造力的精華所在 從任意節點i到任意...