數據結構之圖、廣度優先搜索以及佛洛依德算法

實驗要求
  • 實現圖的抽象數據類型
  • 在鄰接矩陣結構上實現圖的建立運算
  • 在鄰接表結構上實現圖的建立運算
  • 實現網的遍歷運算(廣度優先)
  • 實現最短路徑算法(floyd)
實驗代碼
  • 實現圖的抽象數據類型
//鄰接矩陣結構
typedef struct ArcCell
{
    EType adj;
    InfoType info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct
{
    VertexType vexs[MAX_VERTEX_NUM];
    AdjMatrix arcs;
    int vexnum,arcnum;
    GraphKind kind;
}MGraph;

//鄰接表結構
typedef struct ArcNode
{   int adjvex;
    struct ArcNode *nextarc;
    InfoType *info;
}ArcNode;

typedef struct VNode  //define structure ALGraph
{   VertexType data;
    ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];

typedef struct
{   AdjList vertices;
    int vexnum,arcnum;
    int kind;
}ALGraph;
  • 在鄰接矩陣結構上實現圖的建立運算
int CreatUDN(MGraph &G)
{
    int i=0,j=0,k,vi,vj,w;

    //-----Demo G.vexnum and G.arcnum------
    G.vexnum=3;
    G.arcnum=5;
    //-----------------------------------------

    printf("Please input the number of G.vexnum(eg,G.vexnum=3) : ");
    scanf("%d",&G.vexnum);
    printf("Please input the number of G.arcnum(eg,G.arcxnum=5) : ");
    scanf("%d",&G.arcnum);

    for(i=0;i<G.vexnum;++i)
        for(j=0;j<G.vexnum;++j)
        {
            G.arcs[i][j].info=INFINITY;
            if(i==j) G.arcs[i][j].info=0;
        }//end of for(j=0;j<G.vexnum;++j)

        cout<<"Please input arc(Vi-->Vj):"<<endl
            <<"For example:"<<endl<<"=============="<<endl
            <<"(Vi=1,Vj=2,Weight=4),(Vi=1,Vj=3,Weight=11),(Vi=2,Vj=1,Weight=6)"<<endl
            <<"(Vi=2,Vj=3,Weight=2),(Vi=3,Vj=1,Weight=3)..."<<endl;
        for(k=0;k<G.arcnum;++k)
        {
            cout<<endl<<"Please input the "<<k+1<<"the arc's vi (0<vi<"<<G.vexnum+1<<"): ";
                cin>>vi;
            cout<<"Please input the "<<k+1<<"the arc's vj (0<vj<"<<G.vexnum+1<<"): ";
                cin>>vj;
            cout<<"Please input the "<<k+1<<"the arc's weight (0<weight<"<<INFINITY<<"): ";
                cin>>w;
            i=vi;
            j=vj;
            while(i<1||i>G.vexnum||j<1||j>G.vexnum||w<0)
            {
                cout<<"Input ERROR!"<<endl
                    <<"Please input the "<<k+1<<"the arc's vi (0<vi<"<<G.vexnum+1<<"): ";
                cin>>vi;
            cout<<"Please input the "<<k+1<<"the arc's vj (0<vj<"<<G.vexnum+1<<"): ";
                cin>>vj;
            cout<<"Please input the "<<k+1<<"the arc's weight (0<weight<"<<INFINITY<<"): ";
                cin>>w;
            i=vi;
            j=vj;
            }//end of while
            i--;
            j--;
            G.arcs[i][j].info=w;
        }//end of for
        return (OK);
}//end of CreateUDN() function
  • 在鄰接表結構上實現圖的建立運算
int CreateDG(ALGraph &G)  //CreateDG() sub-function
{
    int IncInfo,i,j,k,v1,v2,w;
    cout<<endl<<"請輸入圖的頂點個數(eg. G.vexnum=4):";
    cin>>G.vexnum;
    cout<<"請輸入圖的弧的條數(eg. G.arcnum=4):";
    cin>>G.arcnum;
    cout<<"請輸入圖的弧上的信息(0 for none)   :";
    cin>>IncInfo;
    for(i=0;i<G.vexnum;++i)//initial G.vertices
    {G.vertices[i].data=i;
    G.vertices[i].firstarc=NULL;}

    cout<<"請輸入弧arc(v1->v2),fo example:(v1=1,v2=3),(v1=2,v2=4)...";
    for(k=0;k<G.arcnum;++k)  //input arc(v1,v2)
    {
        cout<<endl<<"請輸入第"<<k+1<<"條弧的起始頂點 v1(0<v1<G.vexnum):";
        cin>>v1;
        cout<<"請輸入第"<<k+1<<"條弧的終止頂點 v2(0<v2<G.vexnum):";
        cin>>v2;
        i=v1;
        j=v2;
        while(i<1||i>G.vexnum||j<1||j>G.vexnum)//if(v1,v2) illedal again
        {
            cout<<endl<<"請輸入第"<<k+1<<"條弧的起始頂點 v1(0<v1<G.vexnum):";
            cin>>v1;
            cout<<"請輸入第"<<k+1<<"條弧的終止頂點 v2(0<v2<G.vexnum):";
            cin>>v2;
        }//while end

        i--;
        j--;
        ArcNode *p;
        p=(ArcNode *)malloc(sizeof(ArcNode));//allocate memory
        if(!p)
        {cout<<"Overflow!"; return(0);}
        p->adjvex=j;  //assign p
        p->nextarc=G.vertices[i].firstarc;
        p->info=NULL;
        G.vertices[i].firstarc=p;

        if(IncInfo)
        {cout<<"請輸入info:";
        cin>>*(p->info);}
    }//end of if 
    return (OK);
}//end of CreateDG()
  • 實現網的遍歷運算(廣度優先)
void BFSTraverse(ALGraph G)//BFSTraverse() sub-function

{

 int v,w,u;

 int visited[MAX_VERTEX_NUM];

 SqQueue Q;

 for(v=0;v<G.vexnum;++v)

 visited[v]=0;

 InitQueue(Q);

 for(v=0;v<G.vexnum;++v)

 if(visited[v]==0)

 {

 visited[v]=1;

 cout<<v+1<<"-->";

 EnQueue(Q,v);

 while(!QueueEmpty(Q))

 {

 DeQueue(Q,u);

 for(w=G.vertices[u].data;

 G.vertices[u].firstarc!=NULL;

 w=G.vertices[u].firstarc->adjvex,

 G.vertices[u].firstarc=G.vertices[u].firstarc->nextarc)//"右)"

 if(visited[w]==0)

 {

 visited[w]=1;

 cout<<w+1<<"-->";

 EnQueue(Q,w);

 }//if end

 if(visited[w]==0)

 {

 visited[w]=1;

 cout<<w+1<<"-->";

 EnQueue(Q,w);

 }//if end

 }//while end

 }//if end
}//BFSTraverse() end
  • 實現最短路徑算法(floyd)
void ShortestPath_FLOYD(MGraph G,
                      PathMatrix Path[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_NUM],
                      DistancMatrix Dist[MAX_VERTEX_NUM][MAX_VERTEX_NUM])
{
    int i,j,u,v,w;
    for(v=0;v<G.vexnum;++v)
        for(w=0;w<G.vexnum;++w)
        {   Dist[v][w]=G.arcs[v][w].info;
            for(u=0;u<G.vexnum;++u)
                Path[v][w][u]=FALSE;
            if(Dist[v][w]<INFINITY)
            {   Path[v][w][v]=TRUE;
                Path[v][w][w]=TRUE;
            }//end of if
        }//end of for
    for(u=0;u<G.vexnum;++u)
        for(v=0;v<G.vexnum;++v)
            for(u=0;u<G.vexnum;++u)
                if(Dist[v][u]+Dist[u][w]<Dist[v][w])
                {   Dist[v][w]=Dist[v][u]+Dist[u][w];
                    for(i=0;i<G.vexnum;++i)
                        Path[v][w][i]=Path[v][u][i]||Path[u][w][i];
                }//end of if
//------------print the last Dist[i][j]---------------
                printf("Vertice");
                for(i=0;i<G.vexnum;i++)
                    printf("%5d",i+1);
                printf("\n");
                for(i=0;i<G.vexnum;i++)
                {
                    printf("%5d    ",i+1);
                    for(j=0;j<G.vexnum;j++)
                        printf("%5d",Dist[i][j]);
                    printf("\n");
                }//end of for
//---------------------------------------------------
}//shortestPath_FLOYD() end

相關文章:
數據結構之棧(C語言版)
數據結構之樹的相關問題

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,283評論 6 530
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 97,947評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,094評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,485評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,268評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,817評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,906評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,039評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,551評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,502評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,662評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,188評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,907評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,304評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,563評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,255評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,637評論 2 370

推薦閱讀更多精彩內容