无向图指定两点的最短路径,存储方式采用邻接矩阵:
int visited[10]={0};
typedef struct ma{
char vexs[10];
int arcs[10][10];
int vexnum,arcnum;
}netgraph;
//求指定两点的最短路径
typedef struct {
int data;
int former;
}data[10];
typedef struct {
data da;
int first,rear;
int queuesize;
}graphqueue;
int init_queue(graphqueue *G){
G->first=G->rear=0;
G->queuesize=10;
return 0;
}
void enQueue(graphqueue *G,int v0,int v1){
G->da[G->rear%G->queuesize].data=v0;
G->da[G->rear%G->queuesize].former=v1;
G->rear=(G->rear+1)%G->queuesize;
}
int deQueue(graphqueue *G){
int t;
t=G->da[G->first].data;
G->first=(G->first+1)%G->queuesize;
return t;
}
void BF_queue(netgraph G,int v0,int v2){
visited[v0]=1;
graphqueue Q;
init_queue(&Q);
enQueue(&Q,v0,0);
while(Q.first!=Q.rear){
int t0;int t1;
t1=Q.first%Q.queuesize;
t0=deQueue(&Q);
if(v2==t0) {
int t,i=0,flag[10];
t=Q.da[Q.first-1].former;
while(t) {
flag[i++]=t;
t=Q.da[t].former;
}
printf("%c ",G.vexs[v0]);
for(int j=i-1;j>=0;j--)
printf("%c ",G.vexs[flag[j]]);
printf("%c ",G.vexs[v2]);
return ;
}
for(int i=0;i<G.vexnum;i++) {
if(G.arcs[t0][i]&&!visited[i]) {
enQueue(&Q,i,t1);
visited[i]=1;
}
}
}
}