生活随笔
收集整理的這篇文章主要介紹了
图的表示方法和C++实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖的表示最長用的兩種方法是:
1)、鄰接矩陣表示法
2)、鄰接表表示
下面是兩種構造圖的方法
1)鄰接矩陣:
[cpp]?view plaincopy
#include?<iostream>?? #include?<vector>?? using?namespace?std;?? ?? ?? ?? enum?GraphKind?{DG,?WDG,?UDG,?WUDG};?? ?? ?? template?<typename?VertexType,?typename?VRType,?typename?InfoType>?? class?MGraph?? {?? public:?? ????MGraph(int?vexNum,?GraphKind?__kind)?:?vexnum(vexNum),?arcnum(0),?kind(__kind)?? ????{?? ?????????? ????????vvec?=?new?VertexType[vexnum];?? ?????????? ????????arcs?=?new?ArcCell?*[vexnum];?? ????????for?(int?i?=?0;?i?<?vexnum;?i++)?? ????????{?? ?????????????? ????????????arcs[i]?=?new?ArcCell[vexnum];?? ????????}?? ????}?? ?? ????void?Create()?? ????{?? ????????switch?(kind)?? ????????{?? ????????case?DG:??? ????????????{?? ????????????????CreateDG();?????? ????????????????break;?? ????????????}????????????? ????????case?WDG:?? ????????????{?? ????????????????CreateWDG();?????? ????????????????break;?? ????????????}?? ????????case?UDG:?? ????????????{?? ????????????????CreateUDG();?????? ????????????????break;?? ????????????}?? ????????case?WUDG:?? ????????????{??? ????????????????CreateWUDG();????? ????????????????break;?? ????????????}?? ????????default:?? ????????????return;?? ????????}?? ????}?? ?? ?????? ????void?Init()?? ????{?? ????????cout?<<?"請輸入每個頂點的關鍵字:"?<<?endl;?? ????????VertexType?val;?? ????????for?(int?i?=?0;?i?<?vexnum;?i++)?? ????????{?? ????????????cin?>>?val;?? ????????????vvec[i]?=?val;?? ????????}?? ????????for?(int?i?=?0;?i?<?vexnum;?i++)?? ????????{?? ????????????ArcCell?ac;?? ????????????ac.adj?=?0;?? ????????????ac.info?=?NULL;?? ????????????for?(int?j?=?0;?j?<?vexnum;?j++)?? ????????????{????????????? ????????????????arcs[i][j]?=?ac;?? ????????????}?? ????????}?? ????}?? ?? ?????? ????void?CreateDG()?? ????{?? ????????Init();?? ????????int?vhead,?vtail;?? ????????cout?<<?"請依次輸入每條邊的開始頂點和結束頂點:"?<<?endl;?? ????????while?(cin?>>?vhead?>>?vtail)?? ????????{?? ????????????arcnum++;?? ????????????arcs[vhead][vtail].adj?=?1;?? ????????}?? ????}?? ?? ?????? ????void?CreateWDG()?? ????{?? ????????Init();?? ????????int?vhead,?vtail;?? ????????InfoType?w;?? ????????cout?<<?"請依次輸入每條邊的開始頂點和結束頂點和權值:"?<<?endl;?? ????????while?(cin?>>?vhead?>>?vtail?>>?w)?? ????????{?? ????????????arcnum++;?? ????????????arcs[vhead][vtail].adj?=?w;?? ????????}?? ????}?? ?? ?????? ????void?CreateUDG()?? ????{?? ????????Init();?? ????????int?vhead,?vtail;?? ????????cout?<<?"請依次輸入每條邊的開始頂點和結束頂點:"?<<?endl;?? ????????while?(cin?>>?vhead?>>?vtail)?? ????????{?? ????????????arcnum?+=?2;?? ????????????arcs[vhead][vtail].adj??=?1;?? ????????????arcs[vtail][vhead].adj??=?1;?? ????????}?? ????}?? ?? ?????? ????void?CreateWUDG()?? ????{?? ????????Init();?? ????????int?vhead,?vtail;?? ????????InfoType?w;?? ????????cout?<<?"請依次輸入每條邊的開始頂點和結束頂點和權值:"?<<?endl;?? ????????while?(cin?>>?vhead?>>?vtail?>>?w)?? ????????{?? ????????????arcnum?+=?2;?? ????????????arcs[vhead][vtail].adj?=?w;?? ????????????arcs[vtail][vhead].adj?=?w;?? ????????}?? ????}?? ?? ????void?displayGraph()?? ????{?? ????????cout?<<?"總共有"?<<?vexnum?<<?"個頂點,"??? ?????????????<<?arcnum?<<?"條邊"?<<?endl;?? ????????for?(int?i?=?0;?i?<?vexnum;?i++)?? ????????{?? ????????????cout?<<?"第"?<<?i+1?<<?"個頂點是:"?<<?vvec[i]??? ?????????????????<<?"相鄰的邊有:?";?? ????????????for?(int?j?=?0;?j?<?vexnum;?j++)?? ????????????{?? ????????????????if?(arcs[i][j].adj?!=?0)?? ????????????????????cout?<<?vvec[j]?<<?"("?<<?arcs[i][j].adj?<<?")?";??? ????????????}?? ????????????cout?<<?endl;?? ????????}?? ????}?? ?? private:?? ????struct?ArcCell?? ????{?? ????????VRType?adj;????? ???????????????????????? ????????InfoType?info;???? ????};?? ????VertexType?*vvec;???????????? ????ArcCell?**arcs;?????? ????int?vexnum;????????????????????????? ????int?arcnum;????????????????????????? ????GraphKind?kind;????????????????????? };?? ?? int?main()?? {?? ????cout?<<?"構造無向圖:"?<<?endl;?? ????MGraph<char,?int,?int>?udgGraph(8,?UDG);?? ????udgGraph.Create();?? ????udgGraph.displayGraph();?? ?? ????cout?<<?"構造帶權無向圖:"?<<?endl;?? ????MGraph<char,?int,?int>?wudgGraph(9,?WUDG);?? ????wudgGraph.Create();?? ????wudgGraph.displayGraph();?? ?? ????cout?<<?"構造有向圖:"?<<?endl;?? ????MGraph<char,?int,?int>?dgGraph(6,?DG);?? ????udgGraph.Create();?? ????udgGraph.displayGraph();?? ?? ????cout?<<?"構造帶權有向圖:"?<<?endl;?? ????MGraph<char,?int,?int>?wdgGraph(6,?WDG);?? ????wdgGraph.Create();?? ????wdgGraph.displayGraph();?? ?? ????system("pause");?? ????return?0;?? }??
運行了一個帶權有向圖:
2)鄰接鏈表
[cpp]?view plaincopy
#include?<iostream>?? using?namespace?std;?? ?? ?? ?? enum?GraphKind?{DG,?WDG,?UDG,?WUDG};?? ?? template<typename?VertexType,?typename?InfoType>?? class?ALGraph?? {?? public:?? ????ALGraph(int?verNum,?GraphKind?_kind)??? ????????:?vexnum(verNum),?arcnum(0),?kind(_kind)???? ????{?? ????????for?(int?i?=?0;?i?<?MAX_VERTEX_NUM;?i++)?? ????????????vertices[i].firstarc?=?NULL;?? ????}?? ?? ?????? ????void?Create()?? ????{?? ????????switch?(kind)?? ????????{?? ????????case?DG:??? ????????????{?? ????????????????CreateDG();?????? ????????????????break;?? ????????????}????????????? ????????case?WDG:?? ????????????{?? ????????????????CreateWDG();?????? ????????????????break;?? ????????????}?? ????????case?UDG:?? ????????????{?? ????????????????CreateUDG();?????? ????????????????break;?? ????????????}?? ????????case?WUDG:?? ????????????{??? ????????????????CreateWUDG();????? ????????????????break;?? ????????????}?? ????????default:?? ????????????return;?? ????????}?? ????}?? ?????? ?????? ????void?displayGraph()?? ????{?? ????????for?(int?i?=?0;?i?<?vexnum;?i++)?? ????????{?? ????????????cout?<<?"第"?<<?i+1?<<?"個頂點是:"?<<?vertices[i].data?? ????????????????<<?"?鄰接表為:?";?? ????????????ArcNode?*arcNode?=?vertices[i].firstarc;?? ????????????while?(arcNode?!=?NULL)?? ????????????{?? ????????????????cout?<<?"?->?"?<<?vertices[arcNode->adjvex].data?? ????????????????????<<?"("?<<?arcNode->info?<<?")";?? ????????????????arcNode?=?arcNode->nextarc;?? ????????????}?? ????????????cout?<<?endl;?? ????????}?? ????}?? ?? private:?? ?????? ????void?InitVertics()?? ????{?? ????????cout?<<?"請輸入每個頂點的關鍵字:"?<<?endl;?? ????????VertexType?val;?? ????????for?(int?i?=?0;?i?<?vexnum;?i++)?? ????????{?? ????????????cin?>>?val;?? ????????????vertices[i].data?=?val;?? ????????}?? ????}?? ?? ?????? ????void?insertArc(int?vHead,?int?vTail,?InfoType?w)?? ????{?? ?????????? ????????ArcNode?*newArcNode?=?new?ArcNode;?? ????????newArcNode->adjvex?=?vTail;?? ????????newArcNode->nextarc?=?NULL;?? ????????newArcNode->info?=?w;?? ?? ?????????? ????????ArcNode?*arcNode?=?vertices[vHead].firstarc;?? ????????if?(arcNode?==?NULL)?? ????????????vertices[vHead].firstarc?=?newArcNode;?? ????????else?? ????????{?? ????????????while?(arcNode->nextarc?!=?NULL)?? ????????????{?? ????????????????arcNode?=?arcNode->nextarc;???????? ????????????}?? ????????????arcNode->nextarc?=?newArcNode;?? ????????}?? ????????arcnum++;?? ????}?? ?? ?????? ????void?CreateDG()?? ????{?? ????????InitVertics();?? ????????int?vhead,?vtail;?? ????????cout?<<?"請依次輸入每條邊的開始頂點和結束頂點:"?<<?endl;?? ????????while?(cin?>>?vhead?>>?vtail)?? ????????{?? ????????????insertArc(vhead,?vtail,?0);?? ????????}?? ????}?? ?? ?????? ????void?CreateWDG()?? ????{?? ????????InitVertics();?? ????????int?vhead,?vtail;?? ????????InfoType?w;?? ????????cout?<<?"請依次輸入每條邊的開始頂點和結束頂點和權值:"?<<?endl;?? ????????while?(cin?>>?vhead?>>?vtail?>>?w)?? ????????{?? ????????????insertArc(vhead,?vtail,?w);?? ????????}?? ????}?? ?? ?????? ????void?CreateUDG()?? ????{?? ????????InitVertics();?? ????????int?vhead,?vtail;?? ????????cout?<<?"請依次輸入每條邊的開始頂點和結束頂點:"?<<?endl;?? ????????while?(cin?>>?vhead?>>?vtail)?? ????????{?? ????????????insertArc(vhead,?vtail,?0);?? ????????????insertArc(vtail,?vhead,?0);?? ????????}?? ????}?? ?? ?????? ????void?CreateWUDG()?? ????{?? ????????InitVertics();?? ????????int?vhead,?vtail;?? ????????InfoType?w;?? ????????cout?<<?"請依次輸入每條邊的開始頂點和結束頂點和權值:"?<<?endl;?? ????????while?(cin?>>?vhead?>>?vtail?>>?w)?? ????????{?? ????????????insertArc(vhead,?vtail,?w);?? ????????????insertArc(vtail,?vhead,?w);?? ????????}?? ????}?? ?? ?? ?????? ????static?const?int?MAX_VERTEX_NUM?=?20;???? ?? ?? ????struct?ArcNode???????????? ????{?? ????????int?adjvex;?????????? ????????ArcNode?*nextarc;???? ????????InfoType?info;??????? ????};?? ????struct?VNode????????????? ????{?? ????????VertexType?data;?????? ????????ArcNode?*firstarc;???? ????};?? ?? ??????? ?????? ????VNode?vertices[MAX_VERTEX_NUM];?? ????int?vexnum;??????????????? ????int?arcnum;??????????????? ????GraphKind?kind;??????????? };?? ?? int?main()?? {?? ????cout?<<?"構造一個8個頂點的無向圖:"?<<?endl;?? ????ALGraph<char,?int>?udgGraph(8,?UDG);?? ????udgGraph.Create();?? ????udgGraph.displayGraph();?? ?? ????cout?<<?"構造一個9個頂點的帶權無向圖:"?<<?endl;?? ????ALGraph<char,?int>?wudgGraph(9,?WUDG);?? ????wudgGraph.Create();?? ????wudgGraph.displayGraph();?? ?? ????cout?<<?"構造一個6個頂點的有向圖:"?<<?endl;?? ????ALGraph<char,?int>?dgGraph(6,?DG);?? ????dgGraph.Create();?? ????dgGraph.displayGraph();?? ?? ????cout?<<?"構造一個9個頂點的帶權有向圖:"?<<?endl;?? ????ALGraph<char,?int>?wdgGraph(9,?WDG);?? ????wdgGraph.Create();?? ????wdgGraph.displayGraph();?? ?? ????system("pause");?? ????return?0;?? } ?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的图的表示方法和C++实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。