#include<iostream>
using namespace std;
#define inf 32767
#define maxv 10
typedef char elem;
typedef struct MGraph{
elem vexes[maxv];
int edges[maxv][maxv];
int n,e;
}mgraph;
void initial(mgraph& g)
{
int i,j;
g.e=0;
g.n=0;
for(j=0;j<maxv;j++)
g.vexes[j]=0;
for(i=0;i<maxv;i++)
for(j=0;j<maxv;j++)
g.edges[i][j]=inf;
}
int locate(mgraph g,elem u)
{
for(int i=0;i<g.n;i++)
{
if(g.vexes[i]==u)
return i;
}
return -1;
}
void create(mgraph& g)
{
int i,j,k,w;
elem u,v;
printf("请输入有向图的顶点数:");
scanf("%d",&g.n);
printf("请输入有向图的弧数:");
scanf("%d",&g.e);
fflush(stdin);
printf("请输入字符型顶点数据,如ABCD:");
for(j=0;j<g.n;j++)
scanf("%C",&g.vexes[j]);
fflush(stdin);
printf("请输入弧的信息,格式:弧尾,弧头,权值
");
for(k=0;k<g.e;k++)
{
scanf("%c,%c,%d",&u,&v,&w);
i=locate(g,u);
j=locate(g,v);
g.edges[i][j]=w;
fflush(stdin);
}
}
void printg(mgraph g)
{
int i,j;
printf("输入图的邻接矩阵存储信息:
");
printf("顶点数据:
");
for(i=0;i<g.n;i++)
printf("%d:%c
",i,g.vexes[i]);
printf("邻接矩阵数据:
");
for(i=0;i<g.n;i++)
{
for(j=0;j<g.n;j++)
if(g.edges[i][j]==inf)
printf("无穷");
else
printf("%3d",g.edges[i][j]);
printf("
");
}
}
int dist[maxv];
int path[maxv];
bool s[maxv];
void dijkstra(mgraph g,int v)
{
int mindis,i,j,u;
for(i=0;i<g.n;i++)
{
dist[i]=g.edges[v][i];
s[i]=false;
if(g.edges[v][i]<inf)
path[i]=v;
else
path[i]=-1;
}
s[v]=true;
path[v]=0;
for(i=0;i<g.n;i++)
{
mindis=inf;
u=-1;
for(j=0;j<g.n;j++)
if((s[j]==false)&&(dist[j]<mindis))
{
u=j;
mindis=dist[j];
}
if(mindis<inf)
{
s[u]=true;
for(j=0;j<g.n;j++)
if(s[j]==false)
if(g.edges[u][j]<inf&&dist[u]+g.edges[u][j]<dist[j])
{
dist[j]=dist[u]+g.edges[u][j];
path[j]=u;
}
}
}
}
void printpath(mgraph g,int v)
{
int i,j,w;
int road[maxv];
printf("%c到其他各顶点有没有找到最短路径:
",g.vexes[v]);
for(i=0;i<g.n;i++)
if(s[i])
printf("%d:有 ",i);
else
printf("%d:无 ",i);
printf("
");
for(i=0;i<g.n;i++)
if((s[i]==true)&&(i!=v))
{
printf("从%c到%c的最短路径长度为:%d 路径为:",g.vexes[v],g.vexes[i],dist[i]);
printf("%c->",g.vexes[v]);
w=path[i];
j=0;
while(w!=v)
{
road[j]=w;
j++;
w=path[w];
}
for(j--;j>=0;j--)
{
printf("%c->",g.vexes[road[j]]);
road[j]=-1;
}
printf("%c
",g.vexes[i]);
}
else
printf("从%c到%c不存在路径
",g.vexes[v],g.vexes[i]);
}
void main()
{
elem v0;
int v;
mgraph g;
printf("1.初始化函数测试:
");
initial(g);
printf("2.创建函数测试:
");
create(g);
printf("3.输出函数测试:
");
printg(g);
printf("4.求最短路径:
");
printf("请输出源顶点数据v0:");
scanf("%c",&v0);
v=locate(g,v0);
dijkstra(g,v);
printf("5.输出最短路径:
");
printpath(g,v);
printf("
");
}