if(strcmp(u,G.vexs[i])==0)
returni;
return-1;
}
StatusCreateDN(MGraph*G)
{/*采用数组(邻接矩阵)表示法,构造有向网G*/
inti,j,k,w;
VertexTypeva,vb;
printf("请输入有向网G的顶点数,弧数:
");
scanf("%d,%d",&(*G).vexnum,&(*G).arcnum);
printf("请输入%d个顶点的值(<%d个字符):
\n",(*G).vexnum,MAX_NAME);
for(i=0;i<(*G).vexnum;++i)/*构造顶点向量*/
scanf("%s",(*G).vexs[i]);
for(i=0;i<(*G).vexnum;++i)/*初始化邻接矩阵*/
for(j=0;j<(*G).vexnum;++j)
{
(*G).arcs[i][j].adj=INFINITY;/*网*/
}
printf("请输入%d条弧的弧尾弧头权值(以空格作为间隔):
\n",(*G).arcnum);
for(k=0;k<(*G).arcnum;++k)
{
scanf("%s%s%d%*c",va,vb,&w);/*%*c吃掉回车符*/
i=LocateVex(*G,va);
j=LocateVex(*G,vb);
(*G).arcs[i][j].adj=w;/*有向网*/
}
(*G).kind=DN;
returnOK;
}
typedefintQElemType;
/*单链队列--队列的链式存储结构*/
typedefstructQNode
{
QElemTypedata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct
{
QueuePtrfront,rear;/*队头、队尾指针*/
}LinkQueue;
LinkQueueQ;
StatusInitQueue(LinkQueue*Q)
{/*构造一个空队列Q*/
(*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));
if(!
(*Q).front)
exit(OVERFLOW);
(*Q).front->next=NULL;
returnOK;
}
StatusQueueEmpty(LinkQueueQ)
{/*若Q为空队列,则返回TRUE,否则返回FALSE*/
if(Q.front==Q.rear)
returnTRUE;
else
returnFALSE;
}
StatusEnQueue(LinkQueue*Q,QElemTypee)
{/*插入元素e为Q的新的队尾元素*/
QueuePtrp=(QueuePtr)malloc(sizeof(QNode));
if(!
p)/*存储分配失败*/
exit(OVERFLOW);
p->data=e;
p->next=NULL;
(*Q).rear->next=p;
(*Q).rear=p;
returnOK;
}
StatusDeQueue(LinkQueue*Q,QElemType*e)
{/*若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR*/
QueuePtrp;
if((*Q).front==(*Q).rear)
returnERROR;
p=(*Q).front->next;
*e=p->data;
(*Q).front->next=p->next;
if((*Q).rear==p)
(*Q).rear=(*Q).front;
free(p);
returnOK;
}
voidShortestPath_DIJ(MGraphG,intv0,PathMatrix*P,ShortPathTable*D)
{/*用Dijkstra算法求有向网G的v0顶点到其余顶点v的最短路径P[v]及带权长度*/
/*D[v]。
若P[v][w]为TRUE,则w是从v0到v当前求得最短路径上的顶点。
*/
/*final[v]为TRUE当且仅当v∈S,即已经求得从v0到v的最短路径算法7.15*/
intv,w,i,j,min;
Statusfinal[MAX_VERTEX_NUM];
for(v=0;v{
final[v]=FALSE;
(*D)[v]=G.arcs[v0][v].adj;
for(w=0;w(*P)[v][w]=FALSE;/*设空路径*/
if((*D)[v]{
(*P)[v][v0]=TRUE;
(*P)[v][v]=TRUE;
}
}
(*D)[v0]=0;
final[v0]=TRUE;/*初始化,v0顶点属于S集*/
for(i=1;i{/*开始主循环,每次求得v0到某个v顶点的最短路径,并加v到S集*/
min=INFINITY;/*当前所知离v0顶点的最近距离*/
for(w=0;wif(!
final[w])/*w顶点在V-S中*/
if((*D)[w]{
v=w;
min=(*D)[w];
}/*w顶点离v0顶点更近*/
final[v]=TRUE;/*离v0顶点最近的v加入S集*/
EnQueue(&Q,v);
for(w=0;w