這個網址訪問不了了,在次特別找到了緩存,方便你們查閱:http://www.cs.ecnu.edu.cn/assist/js04/ZJS045/ZJS04505/zjs045050a.htmnode
5.5最短路徑 web
|
|
|
5.5.1求一個頂點到其餘各頂點的最短路徑網絡
|
|||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
|
|||||||||||||||||||||||||
|
|||||||||||||||||||||||||
|
完整程序
----------------------------
#include<stdio.h>
#define MAX 9999
void main()
{int ad[ ][MAX]; int k; int pre[MAX]; int dist[MAX];int n,i,j;
printf("pleas input ad[][]!");
prinf("input n");
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{scanf("%d",&ad[i][j]);)
prinf("select Vk");
scanf("%d",&k)
dijkstra(ad,k,pre,dist,n);
}
void dijkstra (int ad[ ][], int k, int pre[ ], int dist[ ], int n)
{
// 求有向圖以頂點Vk爲始點到其餘各項頂點間的最短路徑的dijkstra算法
int , j, p,min;
k=k-1;
for (i=0; i<n; i++) // 初始化
{
dist[i]=ad[k][i];
if (dist[i]<MAX)
pre[i]=k+1;
else
pre[i]=0;
}
pre[k]=0;
dist[k]=0; // 數組dist和pre初始化
ad[k][k]=1; // Vk加入到第一組
for (j=0; j<=(n-1); j++)
{
min=MAX;
p=-1;
for(i=0;i<=(n-1);i++)
if(ad[i][i]= =0 && dist[i]<min)
{
p=i;
min=dist[i];
} // 在第二組中選距離值最小的頂點
if (p = = -1) break; // 以沒有頂點可往第一組加
else
ad [p][p]=1;
// 把第二組中選出的距離最小的頂點加到第一組中
for {i=0; i<m; i++}
if (ad[i][i] = =0 && (min+ad[p][i]<dist[i])
{
dist[i]=min+ad[p][i];
pre[i]=p+1;
}
// 更新第二組中的當前距離值和路徑上前以頂點序號
}
}
-------------------
實際上,咱們也能夠用鄰接表來存儲圖。下面給出採用鄰接表存儲結構的Dijkstra算法。
----------------------------------------------
void shortpath (head, n, m, s)
struct headnode had[100];
int n, m, s[100];
{
int * visit, q[100], front, rear, h, i, j, k;
struct node * p;
visit=malloc(n * sizeof (int));
for (k=0; k<n; k++)
visit[k]=0;
front=0;
rear=0;
for (k=0; k<n; k++)
s[k]=-1;
visit [m-1]=1;
s[m-1]=0;
q[rear]=m;
rear=rear+1;
while (front!=rear)
{
k=q[front];
front=front+1;
p=head[k-1].link;
while (p!=NULL)
{
j=p->vertex;
h=s[k-1]+p->weight;
if((s[j-1] = =-1)||(s[j-1]>h))
{
s[j-1]=h;
if (visit[j-1]= =0)
{
visit[j-1]=1;
q[rear]=j;
rear=rear+1
}
}
p=p->next;
}
}
}
------------------------------------------------------------
5.5.2 求每一對頂點之間的最短路徑
|
|
|
|
|
|
|
Floyd算法
#include<stdio.h> #define MAX 9999 void main() {int ad[ ][MAX]; int k; int p[MAX]; int n,i,j; printf("pleas input ad[][]!"); prinf("input n"); scanf("%d",&n) for(i=0;i<n;i++) for(j=0;j<n;j++) {scanf("%d",&ad[i][j]);} prinf("select Vk"); scanf("%d",&k) floyd(ad,p,n); } void floyd(ad, p, n) int ad[ ][M], p[ ][M], n; //ad存放鄰接矩陣 p存放最短路徑通過的頂點 int i, j, k; for (i=0; i<n; i++) for (j=0; j>n; j++) { if (i= =j) p[i][j]=0; // 頂點自己假設無路徑 else if (ad[i][j]<M) p[i][j]= i+1; // 置p的初始值 else p[i][j]=0; } for (k =0; k<n; k++) // 利用三重循環將各狀況窮舉 for ( i=0; i<n; i++) for (j=0; j>n; j++) if (ad[i][k]+ad[k][j]<ad[i][j]) // 加入中間頂點k來試探 { ad[i][j]=ad[I][k]+ad[k][j]; // 從新置兩點間最短路徑 p[i][j]=p[k][j]; // 將k加入p } } |