Description
编写程序,实现以邻接表作存储结构,求从源点到其余各顶点的最短路径的Dijkstra算法。
Input
第一行输入顶点数n和边数m;第二行输入顶点信息;分m行输入m对顶点vi,vj(表示由顶点vi到顶点vj(i不等于j)的边)以及该弧的权值(0<m,n<100)
Output
输出从源点到其余各顶点的最短路径(不可达用-1表示)。
Sample Input
6 11
1 2 50
1 3 10
1 5 45
2 3 15
2 5 10
3 1 20
3 4 15
4 2 20
4 5 35
5 4 30
6 4 3
Sample Output
1 3 10
1 4 25
1 2 45
1 5 45
1 6 -1
#include <stdio.h>
typedef struct {
int vexs[20];
int arcs[20][20];
int vexnum,arcnum;
}MGraph;
typedef int sumlength[20];
int Locate(MGraph * G,int v)
{
int i=0;
for (i=0;i<G->vexnum; i++)
{
if (G->vexs[i]==v)
{
break;
}
}
if (i>G->vexnum) {
return -1;
}
return i;
}
void creat(MGraph *G)
{ int i,j;
scanf("%d%d",&(G->vexnum),&(G->arcnum));
for (i=0; i<G->vexnum; i++)
{
G->vexs[i]=i+1;
}
for (i=0; i<G->vexnum; i++)
{
for ( j=0; j<G->vexnum; j++)
{
G->arcs[i][j]=65535;
}
}
for ( i=0;i<G->arcnum;i++)
{
int v1,v2,w;
scanf("%d%d%d",&v1,&v2,&w);
int n=Locate(G, v1);
int m=Locate(G, v2);
if (m==-1 ||n==-1)
{
printf("no this vertex\n");
return;
}
G->arcs[n][m]=w;
}
}
void zuiduanlu(MGraph G,int v0,sumlength *D)
{
int final[20];
int i,v;
for (v=0; v<G.vexnum; v++)
{
final[v]=0;
(*D)[v]=G.arcs[v0][v];
}
(*D)[v0]=0;
final[v0]=1;
int k = 0;
int w;
for(i=1;i<G.vexnum;i++)
{
int min=65535;
for (w=0; w<G.vexnum; w++)
{
if (!final[w])
{
if ((*D)[w]<min)
{
k=w;
min=(*D)[w];
}
}
}
final[k]=1;
for ( w=0; w<G.vexnum; w++)
{
if (!final[w]&&(min+G.arcs[k][w]<(*D)[w]))
{
(*D)[w]=min+G.arcs[k][w];
}
}
}
}
int main(){
MGraph G;
creat(&G);
sumlength D;
int i,j,t,temp;
zuiduanlu(G, 0,&D);
for ( i=1; i<G.vexnum; i++)
{
for(j=1;j<G.vexnum-i;j++)
{
if(D[j]>D[j+1])
{
temp=D[j];
D[j]=D[j+1];
D[j+1]=temp;
t=G.vexs[j];
G.vexs[j]=G.vexs[j+1];
G.vexs[j+1]=t;
}
}
}
for ( i=1; i<G.vexnum; i++)
{ if(D[i]!=65535)
{
printf("%d %d %d \n",G.vexs[0],G.vexs[i],D[i]);
}
else
{
printf("%d %d -1 \n",G.vexs[0],G.vexs[i]);
}
}
return 0;
}
这道题题目有点问题,题目要求第二行输入各顶点信息,实际上是默认是1,2,3,.......的,按题目要求输入反而超时