最小生成樹prim普里姆演算法
**標頭檔案
#pragma once
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
#define INFINITY 1000 //無窮大
#define MN 6 //圖的頂點數目
typedef char vertexType;
typedef int arcType;
原始碼
#include"c1.h"
typedef struct {
vertexType vexs[MN];
arcType arcs[MN][MN];
int vexnum, arcnum; // 頂點數和邊數
}MGraph;
MGraph G;
typedef struct{
int fromvex, tovex;
int cost;
}MST[MN- 1]; // 邊的儲存結構
MST T; //存放G的最小生成樹,作為prim的輸出
void CreateMGraph() {
int i, j, k, c;
printf("請輸入圖的頂點數目和邊的數目: ");
scanf_s("%d%d", &G.vexnum, &G.arcnum);
getchar(); //收集垃圾 Enter鍵
printf("輸入圖的各項點資訊: \n");
for (i = 0; i < G.vexnum; i++)
scanf_s("%c", &G.vexs[i]);
for (i = 0; i < G.vexnum; i++)
for (j = 0; j < G.vexnum; j++)
G.arcs[i][j] = INFINITY;
for (k = 0; k < G.arcnum; k++) {
printf("請輸入第%d條邊的兩個端點的序號及權值(i,j,c): ", k + 1);
scanf_s("%d,%d,%d", &i, &j, &c);
G.arcs[i][j] = c;
G.arcs[j][i] = c;
}
}
void InitCondidateSet(MGraph G,int r) {
int i, k = 0;
for (i = 0; i < G.arcnum; i++)
{
if (i != r) {
T[k].fromvex = r;
T[k].tovex = i;
T[k].cost = G.arcs[r][i];
k++;
}
}
}
int SelectLightEdge(int k)
{
int min = INFINITY, minpos = 0;;
for(int i = k;i<MN-1;i++)
if (T[i].cost < min) {
min = T[i].cost;
minpos = i;
}
return minpos;
}
void ModifySet(int k, int v) {
int d;
for (int i = k; i < MN - 1; i++) {
d = G.arcs[v][T[i].tovex];
if (d < T[i].cost) {
T[i].cost = d;
T[i].fromvex = v;
}
}
}
void primMST(MGraph G, int r) {
int m,v;
MST e;
InitCondidateSet(G, r);
for (int k = 0; k < MN - 1; k++) {
m = SelectLightEdge(k);
e[0] = T[m];
T[m] = T[k];
T[k] = e[0];
v = T[k].tovex;
ModifySet(k + 1, v);
}
}
int main()
{
int num;
CreateMGraph();
printf("請輸入第一個項點的序號: ");
scanf_s("%d",&num);
primMST(G, num);
for (int i = 0; i < MN - 1; i++)
{
printf("第%d條邊:V%d----V%d; 權值為%d\n", i + 1, T[i].fromvex, T[i].tovex, T[i].cost);
}
system("pause");
return 0;
相關文章
- 普里姆(Prim)演算法演算法
- 最小生成樹---普里姆演算法(Prim演算法)和克魯斯卡爾演算法(Kruskal演算法)演算法
- 最小生成樹__Prim演算法演算法
- 最小生成樹之 Prim 演算法演算法
- Prim 最小生成樹 圖解圖解
- prim 樸素 最小生成樹
- 最小生成樹-Prim演算法和Kruskal演算法演算法
- 最小生成樹:Kruskal演算法和Prim演算法演算法
- 最小生成樹——Prim演算法和Kruscal演算法演算法
- 【JAVA演算法】圖論演算法 --求最小生成樹Prim演算法Java演算法圖論
- 最小生成樹的性質與prim演算法(C++實現)演算法C++
- 圖論之帶權圖「最小生成樹之Prim」圖論
- 最小生成樹,Prim演算法與Kruskal演算法,408方向,思路與實現分析演算法
- 圖論之帶權圖「最小生成樹prim的優化」圖論優化
- 資料結構------最短路徑Dijkstra和最小生成樹Prim資料結構
- ACM日常訓練日記——8.8(二分dp,最小生成樹+克魯斯卡爾演算法和普利姆演算法)ACM演算法
- 圖論之帶權圖「最小生成樹prim的最佳化」圖論
- 最小生成樹的演算法演算法
- 最小生成樹__Kurskal演算法演算法
- 演算法-圖論-最小生成樹演算法圖論
- 【演算法學習】最小生成樹演算法
- 演算法基礎 第5版 第四章 最小生成樹Prim方法的Ruby實現演算法
- 最小生成樹(MinSpanTree)的Kruskal演算法演算法
- 洛谷 P6362 平面歐幾里得最小生成樹
- 最小生成樹
- Boruvka求最小生成樹(菠蘿演算法)演算法
- 圖論中的最小生成樹演算法圖論演算法
- 【模板】最小生成樹
- 最小度限制生成樹
- 前端必會演算法 - 最小生成樹問題前端演算法
- 【模板】最小生成樹-kruskal
- 最小生成樹專項
- 圖論 最小生成樹圖論
- 圖的最小生成樹
- 【圖論】最小生成樹圖論
- 如何在 Java 中實現最小生成樹演算法Java演算法
- 演算法 最小高度樹演算法
- 普利姆演算法解決最短修路問題演算法