#include <malloc.h>
#include<stdlib.h>
#define MAX 100
#define MAXNUM 10000000
int previous[MAX-1];// 求路徑需要
int pp[MAX-1];// 記錄最短路徑
typedef struct graphnode
{
int vexnum; //頂點
int arcnum; //弧
int gra[MAX][MAX]; //鄰接矩陣表示0或1
}Graph;
int dist[MAX]; // 最短距離
int arc[MAX][MAX]; // 權
int main()
{
void Dijkstra(Graph *g,int v);
int i,j,n,m;
int v; //源點
Graph *G;
G=(Graph *)malloc(sizeof(Graph));
printf("vexnum:\n");
scanf("%d",&G->vexnum);
printf("arcnum:\n");
scanf("%d",&G->arcnum);
printf("graph:\n");
for(i=0;i<G->vexnum;i++)
for(j=0;j<G->vexnum;j++)
{
scanf("%d",&G->gra[i][j]);
}
for(i=0;i<G->vexnum;i++)
for(j=0;j<G->vexnum;j++)
{
if(G->gra[i][j]==1)
{
printf("請輸入%d到%d的權值:",i,j);
scanf("%d",&arc[i][j]);//若有弧 則輸入i到j直接的權
}
else
arc[i][j]=MAXNUM;
}
printf("請輸入源點v的值:");
scanf("%d",&v);
Dijkstra(G,v);
printf("請輸入源點所要到達的點:\n");
scanf("%d",&n);
pp[0]=0;
i=1;
m=n;// 記錄n的值
while(n!=0)// 求0到其他點路徑
{
pp[i]=previous[n];
i++;
n=previous[n];
}
printf("Path:0 -> ");
for(j=G->vexnum-1;j>=0;j--)
if(pp[j]!=0)
printf(" %d -> ",pp[j]);
printf("%d\n",m);
return 0;
}
void Dijkstra(Graph *G,int v)
{
int previous[MAX-1];
int newdist;
bool sign[MAX];
if(v<0||v>MAX-1)
{
printf("該源點不存在!\n");
return;
}
for(int i=0;i<G->vexnum;i++) //初始化
{
dist[i]=arc[v][i];
sign[i]=false;
if(dist[i]==MAXNUM)
previous[i]=0;
else
previous[i]=v;
}
dist[v]=0;
sign[v]=true;
for(i=0;i<G->vexnum;i++) // i<n-1 待定
{
float temp=MAXNUM;
int u=v; //u 中間變量
for(int j=0;j<G->vexnum;j++)
if((!sign[j])&&(dist[j]<temp))
{
u=j;
temp=dist[j];
}
sign[u]=true;
for(j=0;j<G->vexnum;j++)
if((!sign[j])&&(arc[u][j]<MAXNUM))
{
newdist=dist[u]+arc[u][j];
if(newdist<dist[j])
{
dist[j]=newdist;
previous[j]=u;
}
}
}
for(i=0;i<G->vexnum;i++)
if(dist[i]!=MAXNUM)
printf("從%d到%d的最短路徑是 %d\n",v,i,dist[i]);
else
printf("從%d到%d無最短路徑\n",v,i);
printf("\n");
}
這是Dijkstra算法求單源最短路徑算法 上程序中 假定頂點從0開始,搜索整個圖,然後求出0到其他各點的最短距離,存放在dist數組中,main函數後面幾行是求0到其他各點的路徑 基本上能滿足妳的要求了