利用遍歷思想求解圖問題

問題及代碼


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;  
}

運行結果

這裏寫圖片描述


學習心得:

圖的遍歷是很常用的,他的思想應用很廣泛。所以要對這方面加以強化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章