?? 動態(tài)計算網(wǎng)絡(luò)最長最短路線.c
字號:
/*
* File: longest.c
* Desciption: 動態(tài)規(guī)劃算法計算網(wǎng)絡(luò)的最長路線和最短路線
* Created: 2001/12/2
* Author: Justin Hou [mailto:justin_hou@hotmail.com]
*
*/
#include <stdio.h>
#define N 7 /* 頂點數(shù)目 */
#define I 999 /* 表示無窮大 */
int graph[N][N] = { /* 圖的鄰接矩陣 */
{I, 4, 5, 8, I, I, I},
{I, I, I, 6, 6, I, I},
{I, I, I, 5, I, 7, I},
{I, I, I, I, 8, 9, 9},
{I, I, I, I, I, I, 5},
{I, I, I, I, I, I, 4},
{I, I, I, I, I, I, I}
};
int List[N]; /* 存放拓?fù)湫蛄?*/
int TopologicalOrder(); /* 拓?fù)渑判蚝瘮?shù) */
void main() /* 主 函 數(shù) */
{
int i, j, k, l;
int ee[N], el[N]; /* 最長最短距離 */
int path_e[N][N], path_l[N][N], n_e[N], n_l[N]; /* 記錄路徑數(shù)據(jù) */
/* 初始化數(shù)據(jù) */
for (i = 0; i < N; i++) {
n_e[i] = 0; /* 到 i 的最短路線的結(jié)點數(shù) */
n_l[i] = 0; /* 到 i 的最長路線的結(jié)點數(shù) */
ee[i] = I;
el[i] = 0;
}
ee[0] = el[0] = 0; /* 初始化頭結(jié)點 */
path_e[0][0] = 0;
path_l[0][0] = 0;
n_e[0] = 1;
n_l[0] = 1;
/* 拓?fù)渑判?*/
if (!TopologicalOrder())
return;
/* 對于拓?fù)湫蛄?運用動態(tài)規(guī)劃步步算出最長路線與最短路線 */
for (i = 0; i < N; i++) {
/* 提取拓?fù)湫蛄械脑?*/
k = List[i];
/* 更新它所指向頂點的所有數(shù)據(jù) */
for (j = 0; j < N; j++) {
/* 尋找指向的頂點 */
if (graph[k][j] != I) {
/* 如果新路徑更短 */
if (graph[k][j] + ee[k] < ee[j]) {
/* 更新最短路徑長度 */
ee[j] = graph[k][j] + ee[k];
/* 更新最短路線 */
for (l = 0; l < n_e[k]; l++) {
path_e[j][l] = path_e[k][l];
}
path_e[j][l] = j;
n_e[j] = l + 1;
}
/* 如果新路徑更長 */
if (graph[k][j] + el[k] > el[j]) {
/* 更新最長路徑長度 */
el[j] = graph[k][j] + el[k];
/* 更新最長路線 */
for (l = 0; l < n_l[k]; l++) {
path_l[j][l] = path_l[k][l];
}
path_l[j][l] = j;
n_l[j] = l + 1;
}
}
}
}
/* 輸出結(jié)果到屏幕 */
for (i = 0; i < N; i++) {
printf("shortest(%d): %2d Path: ", i + 1, ee[i]);
for (j = 0; j < n_e[i]; j++) {
printf("%d ", path_e[i][j] + 1);
}
printf("\n");
printf("longest (%d): %2d Path: ", i + 1, el[i]);
for (j = 0; j < n_l[i]; j++) {
printf("%d ", path_l[i][j] + 1);
}
printf("\n");
}
}
int TopologicalOrder()
{
int i, j, top, count;
int indegree[N], Stack[N];
top = 0; /* 棧頂標(biāo)志 */
for (i = 0; i < N; i++) {
indegree[i] = 0; /* 初始化入度 */
for (j = 0; j < N; j++) {
if (graph[j][i] != I) { /* 如連通 */
indegree[i]++; /* 入度自增1 */
}
}
if (!indegree[i]){ /* 如入度為零 */
Stack[top++] = i; /* 入棧 */
}
}
count = 0; /* 輸出頂點數(shù) */
while (top != 0) {
i = Stack[--top];
List[count++] = i;
for (j = 0; j < N; j++) {
if (graph[i][j] != I) { /* 如連通 */
if (!(--indegree[j])) { /* 而且入度為零 */
Stack[top++] = j; /* 入棧 */
}
}
}/* for */
}/* while */
return (count < N) ? 0 : 1;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -