篇一:prim算法實驗報告
算法實驗報告
學院:xxx 班級:xxx 學號:xxx 姓名:xxx prim 篇二:prim最小生成樹算法實驗報告 算法分析與設計之prim 學院:軟件學院 學號:201421031059 姓名:呂呂
一、問題描述 1.prim的定義
prim算法是貪心算法的一個實例,用于找出一個有權重連通圖中的最小生成樹,即:具有最小權重且連接到所有結點的樹。(強調的是樹,樹是沒有回路的)。2.實驗目的
選擇一門編程語言,根據prim算法實現最小生成樹,并打印最小生成樹權值。
二、算法分析與設計
1.prim算法的實現過程 基本思想:假設g=(v,e)是連通的,te是g上最小生成樹中邊的集合。算法從u={u0}(u0∈v)、te={}開始。重復執行下列操作:
在所有u∈u,v∈v-u的邊(u,v)∈e中找一條權值最小的邊(u0,v0)并入集合te中,同時v0并入u,直到v=u為止。
此時,te中必有n-1條邊,t=(v,te)為g的最小生成樹。prim算法的核心:始終保持te中的邊集構成一棵生成樹。2.時間復雜度
prim算法適合稠密圖,其時間復雜度為o(n^2),其時間復雜度與邊得數目無關,n為頂點數,而看ruskal算法的時間復雜度為o(eloge)跟邊的數目有關,適合稀疏圖。
三、數據結構的設計 圖采用類存儲,定義如下: class graph { private: int *verticeslist;int **edge;int numvertices;int numedges;int maxvertices;graph();~graph();bool insertvertex(const int vertex);bool insertedge(int v1,int v2,int cost);int getvertexpos(int vertex);int getvalue(int i);int getweight(int v1,int v2);int numberofvertices();1 public: } void prim();其中,圖中結點連接情況及權值使用二重指針表示,即二維數組實現鄰接矩陣。
四、代碼與運行結果 代碼運行結果:
源碼:
//普雷姆算法
#include using namespace std;const int maxweight=10000;const int defaultvertices=10000;const int maxedges=10000;const int maxint = 10000000;class graph{ private: int *verticeslist;2 };int numvertices;int numedges;int maxvertices;graph();~graph();bool insertvertex(const int vertex);bool insertedge(int v1,int v2,int cost);int getvertexpos(int vertex);int getvalue(int i);int getweight(int v1,int v2);int numberofvertices();int numberofedges();void prim();void lvlv(graph &g);public: istream& operator>>(istream& in,graph &g);ostream& operator<<(ostream& out,graph &g);//默認構造函數 graph::graph(){ };graph::~graph(){ delete []verticeslist;delete []edge;3 maxvertices=defaultvertices;numvertices=0;numedges=0;int i,j;verticeslist=new int [maxvertices];edge=(int **)new int *[maxvertices];for(i=0;iint graph::getvalue(int i){ };int graph::getweight(int v1,int v2){ };int graph::numberofvertices(){ };int graph::numberofedges(){ };//插入結點 bool graph::insertvertex(const int vertex){ };//插入邊,v1和v2為結點在數組的下標
bool graph::insertedge(int v1,int v2,int cost){
if(v1>-1&&v1-1&&v2=0&&i<=numvertices)?verticeslist[i]:null;return(v1!=-1&&v2!=-1)?edge[v1][v2]:0;return numvertices;return numedges;if(numvertices==maxvertices)return false;verticeslist[numvertices++]=vertex;return true;};} return true;else return false;//輸入圖信息
istream& operator>>(istream &in ,graph &g){ };//輸出圖對象
ostream& operator<<(ostream &out,graph &g){ int i,j,vertices,edges;int start,end,weight;vertices=g.numberofvertices();edges=g.numberofedges();out<in>>vertices>>edges;for(i=1;i<=vertices;i++){ } i=0;while(i>start>>end>>weight;j=g.getvertexpos(start);k=g.getvertexpos(end);if(j==-1||k==-1){} g.insertedge(j,k,weight);i++;cout<黃岡師范學院 提高型實驗報告
實驗課題 最小生成樹的prim算法
(實驗類型:□綜合性 ■設計性 □應用性)
實驗課程 算法程序設計 實驗時間2010年12月24日
學生姓名 周 媛鑫 專業班級 計科 0801 學 號 200826140110 一.實驗目的和要求
(1)根據算法設計需要, 掌握連通網的靈活表示方法;(2)掌握最小生成樹的prim算法;(3)熟練掌握貪心算法的設計方法;二.實驗條件
(1)硬件環境:實驗室電腦一臺(2)軟件環境:wintc 三.實驗原理分析
(1)最小生成樹的定義:
假設一個單位要在n個辦公地點之間建立通信網,則連通n個地點只需要n-1條線路。可以用連通的無向網來表示n個地點以及它們之間可能設置的通信線路,其中網的頂點表示城市,邊表示兩地間的線路,賦于邊的權值表示相應的代價。對于n個頂點的連通網可以建立許多不同的生成樹,每一棵生成樹都可以表示一個通信網。其中一棵使總的耗費最少,即邊的權值之和最小的生成樹,稱為最小生成樹。
(2)構造最小生成樹可以用多種算法。其中多數算法利用了最小生成樹的下面一種簡稱為mst的性質:假設n=(v,{e})是一個連通網,u是頂點集v的一個非空子集。若(u,v)是一條具有最小權值(代價)的邊,其中u∈u,v∈v-u,則必存在一棵包含邊(u.v)的最小生成樹。(3)普里姆(prim)算法即是利用mst性質構造最小生成樹的算法。算法思想如下: 假設n=(v,{e})和是連通網,te是n上最小生成樹中邊的集合。算法從u={u0}(u0∈v),te={}開始,重復執行下述操作:在所有u∈u,v∈v-u的邊(u, v)∈e中找一條代價最小的邊(u0, v0)并入集合te,同時v0并入u,直到u=v為止。此時te中必有n-1條邊,則t=(v,{te})為n的最小生成樹。四.實驗步驟
(1)數據結構的設計 :
采用鄰接矩陣的存儲結構來存儲無向帶權圖更利于實現及操作: 鄰接矩陣的抽象數據結構定義: #defineinfinityint_max //最大值
#define max_ertex_num20 //最大頂點數
typedef enum {dg,dn,udg,udn}graphkind;//{有向圖,有向網,無向網,無向圖} typedef struct arc cell{ vrtype adj;// vrtype 是頂點關系的類型。對無權圖用1和0表示相鄰否; infotype * info;//該弧相關信息的指針
}arccell,adjmatrix [ max_vertex_num][max_vertex_num]; typedef struct { vertextype vexs [ max_vertex_num];//頂點向量adjmatrixarcs;// 鄰接矩陣 intvexnum , arcnum;//圖的當前頂點數和弧數 graphkindkind;// 圖的種類標志 }mgraph;(2)函數設計
函數名稱 函數原型 功能描述
main()int main(void)系統調用主函數 huiru()void huitu()繪制無向圖
graphicver()void graphicver(graph *g)輸出鄰接矩陣 prim()void prim(graph *g)prim算法演示(3)實驗源代碼
#include #include #include #include #include #define maxvertexnum 50 #define inf 32767 typedef struct graphic {char vexs[maxvertexnum];int edges[maxvertexnum][maxvertexnum];int v,e;}graph;char tmp[10];void huitu()/*無向圖的圖形生成*/ {char buffer[100];int graphdriver = detect, graphmode;int i,xbefore,ybefore;int x1,y1;char c;/*registerbgidriver(egavga_driver);initgraph(&graphdriver, &graphmode,);cleardevice();printf(input pot(300v,&g->e);for(i=1;i<=g->v;i++)for(j=1;j<=g->v;j++)if(i==j)g->edges[i][j]=0;else{ g->edges[i][j]=inf;} for(k=1;k<=g->e;k++){printf(input %dth edge :,k);scanf(%d,%d,%d,&v1,&v2,&weight);g->edges[v1][v2]=g->edges[v2][v1]=weight;} for(i=1;i<=g->v;i++){printf(n);for(j=1;j<=g->v;j++)printf((g->edges[i][j]==inf)?∞t:%dt,g->edges[i][j]);} printf(n);system(pause);} /***************prim 算法生成最小生成樹***************/ void prim(graph *g){int lowcost[maxvertexnum],closest[maxvertexnum];int i,j,k,min;for(i=2;i<=g->v;i++)/*n個頂點,n-1條邊 */ {lowcost[i]=g->edges[1][i];closest[i]=1;} lowcost[1]=0;/*標志頂點1加入u集合*/ for(i=2;i<=g->v;i++)/*形成n-1條邊的生成樹 */ {min=inf;k=0;for(j=2;j<=g->v;j++)if((lowcost[j]v;j++)/*修改由頂點k到其他頂點邊的權值*/ if(g->edges[k][j]edges[k][j];closest[j]=k;}printf(n);} } setviewport(150,140,630,310,1);cleardevice();setcolor(green);rectangle(10,10,470,160);line(10,60,470,60);line(10,110,470,110);for(i=0;i
主站蜘蛛池模板:
青青草国产精品一区二区|
精品人妻少妇嫩草AV无码专区|
婷婷中文字幕综合在线|
亚洲乱亚洲乱少妇无码99p|
欧美精品18videosex性欧美|
欧美成人精品高清视频在线观看|
亚洲熟妇自偷自拍另类|
国语精品一区二区三区|
日日碰狠狠添天天爽五月婷|
精品卡一卡二卡3卡高清乱码|
最近免费中文字幕中文高清6|
国产成人欧美视频在线观看|
亚洲高清无在码在线电影|
国产精品视频在线观看|
亚洲人成人伊人成综合网无码|
大肉大捧一进一出视频出来呀|
国产又粗又猛又爽又黄的视频在线观看动漫|
色综合天天综合狠狠爱_|
久久成人网站亚洲综合|
国产高清色高清在线观看|
亚洲日韩国产欧美一区二区三区|
日韩人妻一区二区三区免费|
丰满熟妇乱又伦在线无码视频|
欧美成人va免费大片视频|
中文字幕乱码免费|
99www久久综合久久爱com|
国产精品午夜福利麻豆|
亚洲国产精品久久久久婷婷软件|
日韩中文字幕v亚洲中文字幕|
中文字幕精品久久久久人妻|
欧美日韩免费一区中文|
色欲色香天天天综合无码www|
无码av天天av天天爽|
激情偷乱人伦小说视频在线|
好紧好湿好硬国产在线视频|
韩国无码中文字幕在线视频|
中国亚洲女人69内射少妇|
蕾丝av无码专区在线观看|
国产福利姬喷水福利在线观看|
好紧好爽好深再快点av在线|
日韩va中文字幕无码电影|