最小生成樹的兩種最基本的演算法

2021-08-02 20:22:39 字數 1967 閱讀 3077

/**

@cain

*/#include

using namespace std;

const int maxn=2005;

const int inf=1e9+5;

int edge[maxn][maxn];

int near[maxn];

int low[maxn];

int p,l,n;

void prim()

for(int i=0;ifor(int j=0;jif(i==j)

edge[i][j]=0;

else

if(edge[i][j]==0)

edge[i][j]=inf;

}}//這個是輸入為點-點-邊的存法.*/

for(int i=0;i//無向圖;有向圖把存臨接矩陣那改一下就可以了.

for(int j=0;j"%d",&edge[i][j]);

}}//這個是輸入為矩陣的存法.

/*for(int i=0;i//列印鄰接矩陣.

for(int j=0;jprintf("%d ",edge[i][j]);

}printf("\n");

}*/prim();//所以prim即適用於矩陣輸入,也適用於邊輸入.只是邊輸入時用kruskal更簡單.}/*

3012

1032

30//這個是矩陣的存法.31

2113

2233//這個是kruskal的存法.

*/

//這個是有兩種寫法,如果單獨算最小生成樹,則節點 最好選其 本身 ,如果加上判環那些則節點最好選為-1,在此都貼下 相應**.

節點為本身的

/** @cain*/

#include

using

namespace

std;

const

int maxn=1e5+5;

int n,m;

int pre[maxn];

struct node

; bool

operator

< (const node &a) const

}s[maxn];

int find(int x)

void solve()

for(int i=0;i<=n;i++) pre[i] = i;

sort(s,s+m);

int ans = 0,num=0;

for(int i=0;iint u = find(s[i].u),v = find(s[i].v);

if(u != v)

if(num == n-1) break;

}printf("%d\n",ans);

}}

//有時候節點為-1時題目的要求會好實現的多! 所以還是要學到!!! 至少要記得有這種方式 !!!

節點為-1的.

/** @cain*/

#include

using

namespace

std;

const

int maxn=1e5;

int n,m;

int fa[maxn];

struct node

; bool

operator

< (const node &a) const

}s[maxn];

int find(int x)

void union(int x,int y)

else

}void kruskal()

if(sum>=n-1) break;;

}printf("ans = %d\n",ans);

}int main()

sort(s,s+m);

kruskal();

}

最小生成樹(兩種演算法)

ifndef min tree h define min tree h include include include include include data struct data struct.h include tool tool disjoint set.h 最小生成樹 假設圖中的頂點有n...

最小生成樹的兩種實現

kruskal演算法的實現 根據最一般的kruskal 演算法的實現原理,本人設計並實現的演算法如下 首先在此演算法中,選邊的過程中,要首先對存在邊按權值按非遞減的順序排列,以順序判斷並加入最小生成樹邊的集合。因此設計資料結構 typedef struct myedge,eptr 在此資料結構中,a...

最小生成樹兩種解法

運用了貪心的演算法。是從某個頂點開始不斷新增邊的演算法。int cost max v max v 存邊權 int mincost max v 從集合x出發的邊到每個頂點的最小權值 int book max v int v intprim mincost 0 0 int res 0 while 1 i...