#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...