该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
using namespace std;
#define INFINITY 100
#define MAXNODE 10
typedef char ElemType;
typedef struct
{
int adj;
}ArcType;
typedef struct
{
char *city[1];
}name;
typedef struct
{
name vertexs[MAXNODE];
ArcType arcs[MAXNODE][MAXNODE];
int vexnum,arcnum;
}GraphType;
/*****************求该顶点的位置********************/
int LocateVex(GraphType G,ElemType *u[1])
{
int i=-1,k;
for(k=0;k
if(**(G.vertexs[k].city)==**u)
{
i=k;
break;
}
return i;//失败返回-1
}
/*************建立图的邻接矩阵******************/
int CreatDN(GraphType *G)
{
int i,j,k,weight;
ElemType *u1[1],*u2[1];
cout<
cin>>G->vexnum>>G->arcnum;
for(i=0;ivexnum;i++)
for(j=0;jvexnum;j++)
G->arcs[i][j].adj=INFINITY;
cout<
for(i=0;ivexnum;i++)
cin>>*G->vertexs[i].city;
for(k=0;karcnum;k++)
{
cout<
cin>>*u1>>*u2>>weight;
i=LocateVex(*G,u1);
j=LocateVex(*G,u2);
G->arcs[i][j].adj=weight;
G->arcs[j][i].adj=weight;//无向图
}
return 1;
}
/***********从一点到其余各点的最短距离***************/
void Dijkstra(GraphType *G,char *u[1],char *v[1])
{
int i1=LocateVex(*G,u);
int i2=LocateVex(*G,v);
int i,k,t,j;
int *d=new int[5];
int *s=new int[5];
int *p=new int[5];
int way[20];//保存路径用
for(s[i1]=1,i=0;ivexnum;i++) //初始化数组d,s,p
{
if(i!=i1)
{
s[i]=0;d[i]=G->arcs[i1][i].adj;way[i]=i;
if(d[i]
p[i]=0;
else p[i]=-1;
}
}
for(i=0;ivexnum;i++)
{
if(i!=i1)
{
t=INFINITY;k=1;
for(j=0;jvexnum;j++)
if((j!=i1)&&(!s[j])&&(d[j]
{
t=d[j];k=j;
}
s[k]=1;
for (j=0;jvexnum;j++)
if((j!=i1)&&(!s[j])&&(d[j]>d[k]+G->arcs[k][j].adj))
{
d[j]=d[k]+G->arcs[k][j].adj;//d用于保存最短路径的长度
p[j]=k;
way[j]=way[k]*10+j;//若该点属于最短路径,则保存该点
}
}
}
if(d[i2]==100)//不存在路径
cout<
else
{
cout<
int a[MAXNODE],b[MAXNODE],a1=0,b1=0;
cout<vertexs[i1].city;
while(way[i2]/10!=0||way[i2]!=0)
{
a[a1]=way[i2]%10;
a1++;way[i2]=way[i2]/10;
}
a1--;
while(a1>=0)
{
b[b1]=a[a1];
cout<"<vertexs[b[b1]].city;
b1++;a1--;
}
}
cout<
}
/***************初始化图**************************/
GraphType *chushihua(GraphType *G)
{
G=(GraphType*)malloc(sizeof(GraphType));
G->vexnum=8;
G->arcnum=9;
for(int i=0;ivexnum;i++)
for(int j=0;jvexnum;j++)
G->arcs[i][j].adj=INFINITY;
*G->vertexs[0].city="男生宿舍";*G->vertexs[1].city="女生宿舍";*G->vertexs[2].city="图书馆";
*G->vertexs[3].city="食堂";*G->vertexs[4].city="行政楼";*G->vertexs[5].city="教学楼";
*G->vertexs[6].city="篮球场";*G->vertexs[7].city="百盛";
G->arcs[0][1].adj=2;G->arcs[1][0].adj=2;
G->arcs[1][2].adj=6;G->arcs[2][1].adj=6;
G->arcs[2][3].adj=9;G->arcs[3][2].adj=9;
G->arcs[1][3].adj=7;G->arcs[3][1].adj=7;
G->arcs[4][3].adj=18;G->arcs[3][4].adj=18;
G->arcs[5][1].adj=15;G->arcs[1][5].adj=15;
G->arcs[3][5].adj=12;G->arcs[5][3].adj=12;
G->arcs[5][6].adj=22;G->arcs[6][5].adj=22;
G->arcs[5][4].adj=3;G->arcs[4][5].adj=3;
return G;
}
void caidan(GraphType *G)
{
char *q[1];char *w[1];
char b[10],a[10];
cout<
cin>>a;*w=a;
while(LocateVex(*G,w)>7||LocateVex(*G,w)<0)
{cout<
cin>>a;*w=a;
}
cout<
cin>>b;*q=b;
while(LocateVex(*G,w)>7||LocateVex(*G,w)<0)
{cout<
cin>>a;*w=a;
}
Dijkstra(G,w,q);
}
//------------------------------------------------------
void main()
{
GraphType *G;
G=chushihua(G);
cout<
cout<
char i='5';
while(i)
{cout<
cin>>i;
if(i!='1'&&i!='2')continue;
switch(i)
{
case '1':caidan(G);break;
case '2':i=0;
}
}
}
还有很多类似的程序,懒得发了,有需要的加qq群:50379656