問題及代碼
main函數
int main()
{
ALGraph *G;
int A[9][9]=
{
{0,1,1,0,0,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,0,1,1,0,0,0},
{0,0,0,0,0,0,1,0,0},
{0,0,0,0,0,1,1,0,0},
{0,0,0,0,0,0,0,1,0},
{0,0,0,0,0,0,0,1,1},
{0,0,0,0,0,0,0,0,1},
{0,0,0,0,0,0,0,0,0}
}; //請畫出對應的有向圖
ArrayToList(A[0], 9, G);
ShortPath(G,0,7);
return 0;
}
源文件
typedef struct
{
int data; //頂點編號
int parent; //前一個頂點的位置
} QUERE; //非環形隊列類型
void ShortPath(ALGraph *G,int u,int v)
{
//輸出從頂點u到頂點v的最短逆路徑
ArcNode *p;
int w,i;
QUERE qu[MAXV]; //非環形隊列
int front=-1,rear=-1; //隊列的頭、尾指針
int visited[MAXV];
for (i=0; i<G->n; i++) //訪問標記置初值0
visited[i]=0;
rear++; //頂點u進隊
qu[rear].data=u;
qu[rear].parent=-1;
visited[u]=1;
while (front!=rear) //隊不空循環
{
front++; //出隊頂點w
w=qu[front].data;
if (w==v) //找到v時輸出路徑之逆並退出
{
i=front; //通過隊列輸出逆路徑
while (qu[i].parent!=-1)
{
printf("%2d ",qu[i].data);
i=qu[i].parent;
}
printf("%2d\n",qu[i].data);
break;
}
p=G->adjlist[w].firstarc; //找w的第一個鄰接點
while (p!=NULL)
{
if (visited[p->adjvex]==0)
{
visited[p->adjvex]=1;
rear++; //將w的未訪問過的鄰接點進隊
qu[rear].data=p->adjvex;
qu[rear].parent=front;
}
p=p->nextarc; //找w的下一個鄰接點
}
}
}
運行結果
main函數
int main()
{
ALGraph *G;
int A[9][9]=
{
{0,1,1,0,0,0,0,0,0},
{0,0,0,1,1,0,0,0,0},
{0,0,0,0,1,1,0,0,0},
{0,0,0,0,0,0,1,0,0},
{0,0,0,0,0,1,1,0,0},
{0,0,0,0,0,0,0,1,0},
{0,0,0,0,0,0,0,1,1},
{0,0,0,0,0,0,0,0,1},
{0,0,0,0,0,0,0,0,0}
}; //請畫出對應的有向圖
ArrayToList(A[0], 9, G);
printf("離頂點0最遠的頂點:%d",Maxdist(G,0));
return 0;
}
源文件
int Maxdist(ALGraph *G,int v)
{
ArcNode *p;
int i,j,k;
int Qu[MAXV]; //環形隊列
int visited[MAXV]; //訪問標記數組
int front=0,rear=0; //隊列的頭、尾指針
for (i=0; i<G->n; i++) //初始化訪問標誌數組
visited[i]=0;
rear++;
Qu[rear]=v; //頂點v進隊
visited[v]=1; //標記v已訪問
while (rear!=front)
{
front=(front+1)%MAXV;
k=Qu[front]; //頂點k出隊
p=G->adjlist[k].firstarc; //找第一個鄰接點
while (p!=NULL) //所有未訪問過的相鄰點進隊
{
j=p->adjvex; //鄰接點爲頂點j
if (visited[j]==0) //若j未訪問過
{
visited[j]=1;
rear=(rear+1)%MAXV;
Qu[rear]=j; //進隊
}
p=p->nextarc; //找下一個鄰接點
}
}
return k;
}
運行結果
學習心得:
圖的遍歷是很常用的,他的思想應用很廣泛。所以要對這方面加以強化。