[NOJ]数据结构实验4.2 用迪杰斯特拉算法求赋权图中的最短路径
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int vex[100];
int arcs[100][100];
int vexnum,arcnum;
}Graph;
int sum[100];
int pre[100];
void creat(Graph *G)
{
int i,j;
scanf("%d",&G->vexnum);
for(i=0;i<G->vexnum;i++)
{
for(j=0;j<G->vexnum;j++)
{
scanf("%d",&G->arcs[i][j]);
}
}
}
void find(Graph G,int vi)
{
int a[100];
int i,j,k,min;
for(i=0;i<G.vexnum;i++)
{
a[i]=0;
sum[i]=G.arcs[vi][i];
pre[i]=vi;
}
a[vi]=1;
for(i=1;i<G.vexnum;i++)
{
min=10000;
for(j=0;j<G.vexnum;j++)
{
if(!a[j])
{
if(sum[j]<min)
{
k=j;
min=sum[j];
}
}
}
a[k]=1;
for(j=0;j<G.vexnum;j++)
{
if(!a[j]&&(min+G.arcs[k][j]<sum[j]))
{
sum[j]=min+G.arcs[k][j];
pre[j]=k;
}
}
}
}
int main()
{
Graph G;
creat(&G);
int i=0,vi,vj,k,j;
int ans[100];
scanf("%d %d",&vi,&vj);
find(G,vi);
ans[i++]=vj;
k=pre[vj];
while(k!=vi)
{
ans[i++]=k;
k=pre[k];
}
ans[i]=vi;
for(j=i;j>=0;j--) printf("%d\n",ans[j]);
return 0;
}