从键盘输入一串字符,表示若干个顶点的信息
输入若干个字符对和一个整数,分别表示弧尾、弧头和权值,以#作为输入结束
输入一个顶点信息
求出该顶点到其余各顶点的最短路径。
输入:ABCDEFGH
AB 6
AD 1
AF 50
BC 43
BD 11
BE 6
CH 8
DE 12
EC 38
EG 24
FE 1
FG 12
GH 20A
问题:输出都为0
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxSize 10
#define MaxVertices 50
#define MAXNUM 32767
int dist[MaxVertices];//存放从顶点v0到其他各顶点的当前最短路径的长度
int path[MaxVertices];//存放在最短路径上该顶点的前一顶点
int s[MaxVertices];//存放已求得的在最短路径上的顶点
typedef struct
{
char vertex[MaxSize];//用来存储数组顶点信息
int act[MaxSize][MaxSize];//邻接矩阵用二维数组表示
int vertexNum, arcNum;
}Mgraph;
int inorder(Mgraph *G)
{
int i = 0;
char c;
c = getchar();
while(c!='\n')
{
G->vertex[i]=c;
i++;
c=getchar();
}
return i;
}
//建立有向图
void Createjm(Mgraph *G,int n)
{
int i,j,k;
int a,b;
char s,y;
G->vertexNum=n;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
G->act[i][j]=0;
}
}
while(1)
{
scanf("%c",&s);
if(s=='#')break;
else
{
scanf("%c %d",&y,&k);
a=(int)s-65;b=(int)y-65;
G->act[a][b]=k;
getchar();
}
}
}
void Dijkstra(Mgraph *G,char q)//G是具有n个顶点的带权有向图,求从源点v到其余各顶点的最短路径长度
{
int v;
v=(int)q-65;
char m;
int i,j;
for(i=0;i<G->vertexNum;i++)
{
dist[i]=G->act[v][i];
s[i]=0;
if(i!=v&&dist[i]<MAXNUM)
path[i]=v;
else
path[i]=-1;//顶点i无前顶点
}
s[v]=1;//顶点v加入已求出的最短路径的顶点集合
dist[v]=0;
for(i=0;i<G->vertexNum;i++)//求其余n-1个顶点的最短路径
{
int min=MAXNUM;
int u=v;
for(j=0;j<G->vertexNum;j++)
if(!s[j]&&dist[j]<min)
{
u=j;
min=dist[j];
}
s[u]=1;//顶点u加入到已求出最短路径的顶点集合
m=(char)(u+65);
if(m!=q)
{
printf("%c%c %d",q,m, min);
printf("\n");
}
for(int w=0;w<G->vertexNum;w++)//修改其余顶点的当前最短路径
if(!s[w]&&G->act[u][w]<MAXNUM&&dist[u]+G->act[u][w]<dist[w])
{
dist[w]=dist[u]+G->act[u][w];
path[w]=u;
}
}
}
int main()
{
Mgraph G;
int k;
k = inorder(&G);
Createjm(&G,k);
getchar();
char s;
s=getchar();
int v;
v=(int)s-65;
Dijkstra(&G,s);
}