最小生成樹Prim演算法

2021-07-03 03:56:59 字數 1883 閱讀 6165

#include

#include

#define maxvex 100 //最大頂點數

typedef

char vertextype; //頂點

typedef

int edgetype; //權值

#define infinity 65535 /*用65535來代表∞*/

#define unvisited -1 //標記未訪問

#define visited 1 //標記未訪問

//dist的儲存結構

typedef

struct

dist;

typedef

struct

edge; //邊的結構

//圖的結構

typedef

struct

graph;

//初始化圖(初始化mark陣列,d陣列)

void initgraph(graph * g,int s,int numvert,int numed ) //傳入頂點個數,邊數,s為源點}}

g->d[s].length=0;

g->mark[s]=visited; //開始源點標記為visited

return ;

}//判斷是否為邊

bool isedge(edge oneedge)

else

}//建立無向圖的鄰接矩陣

void creatgraph(graph * g)

for(k=0;knumedge;k++)

}//返回頂點個數

int verticesnum(graph * g)

//返回依附於頂點的第一條邊

edge firstedge(graph * g,int onevertex)

}return firstedge;

}

//返回oneedge的終點

int tovertex(edge oneedge)

//返回與preedge有相同頂點的下一條邊

edge nextedge(graph * g,edge preedge)

}return myedge;

}int minvertex(graph * g)

}for(i=0;inumvertex;i++)

}return v;

}//設定一條邊

edge setedge(int from,int to,int weight)

void edge_to_mst(graph * g,edge e,int num)

//列印出mst陣列

void print_mst(graph * g,int n)

printf("\n");

}void prim(graph * g,int s)

}v=minvertex(g); //找出最小的邊

g->mark[v]=visited;

edge edge=setedge(g->d[v].pre,g->d[v].index,g->d[v].length);

edge_to_mst(g,edge,msttag++); //最小生成樹的邊數+1

}print_mst(g,msttag); //輸出結果

最小生成樹(prim演算法)

最小生成樹是資料結構中圖的一種重要應用,它的要求是從乙個帶權無向完全圖中選擇n 1條邊並使這個圖仍然連通 也即得到了一棵生成樹 同時還要考慮使樹的權最小。prim演算法要點 設圖g v,e 其生成樹的頂點集合為u。把v0放入u。在所有u u,v v u的邊 u,v e中找一條最小權值的邊,加入生成樹...

最小生成樹 Prim演算法

prim 演算法 以領接矩陣儲存 圖g bool b i 表示頂點i是否被訪問,初始化時候memset b,false,sizeof b b 0 value,表示從第0個節點開始。用value i 表示節點i到最小生成樹a中定點的最小距離。例如value 1 a 0 1 int sum記錄權值和 i...

最小生成樹 prim 演算法

一 演算法描述 假設存在連通帶權圖g v,e 其中最小生成樹為t,首先從圖中隨意選擇一點s屬於v作為起始點,並將其標記後加入集合u 中。然後演算法重複執行操作為在所有v屬於u,u屬於v u的邊 v0,u0 屬於e中找一條代價最小的邊並加入集合t,同時將u0併入u,直到u v為止。這是,t中必有n 1...