国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

歡迎使用CSDN-markdown編輯器

2019-11-08 03:07:26
字體:
來源:轉載
供稿:網友

最小生成樹算法模板 包含Kruskal和PRim模板

#include <iostream>#include<bits/stdc++.h>using namespace std;#define maxn 2999//kruskal 算法 貪心的求出最小生成樹struct node{ int u,v,w;};//為了方便排序,建立一個結構體來存儲邊的關系node e[maxn];int n,m,sum=0,num=0,f[maxn+3];//f[]為并查集數組//快排原函數void quicksort(int left,int right){ int i,j; if(left>right) return; i = left; j = right; while(i!=j) { while(e[j].w>=e[left].w&&i<j) { j--; }//先從右邊找到一個比基準數小的 while(e[i].w<+e[left].w&&i<j) { i++; } if(i<j) { swap(e[i],e[j]); } } swap(e[i],e[left]); quicksort(left,i-1); quicksort(i+1,right); return ;}int getf(int t)//遞歸找爹函數{ if(f[t]==t) return t; else { f[t] = getf(f[t]);//途中路徑壓縮 return f[t]; }}int amerge(int v,int u)//并查集合并子集函數,此處增加了判斷兩個點是否在同一個集合的功能{ int t1 = getf(v); int t2 = getf(u); if(t1!=t2) { f[t2] = t1; return 1; } return 0;}//在判斷此邊是否聯通時,假如尚未聯通則聯通此邊,直到滿足cout == n-1即選用了N-1條邊為止//排序算法借鑒了貪心思想int main(){int i;while(~scanf("%d%d",&n,&m)){ for(i=1;i<=m;i++)//依次讀入各邊 scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w); quicksort(1,m);//按照邊長(權值)依次排序 for(i=1;i<=n;i++) { f[i] = i; } num = 0,sum = 0; //核心部分 for(i=1;i<=m;i++) { if(amerge(e[i].u,e[i].v))//如果兩個頂點尚未聯通,則選用這條邊 { num++; sum+=e[i].w; } if(num==n-1) { break; } } printf("%d/n",sum);}return 0;}

模板2:

#include <iostream>#include<bits/stdc++.h>using namespace std;#define inf 99999999#define maxn 2002//Prim算法模板int e[maxn][maxn],book[maxn],dis[maxn],n,m,t1,t2,t3;int main(){ while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) e[i][j]=0; else e[i][j]= inf; } } for(int i=1;i<=m;i++) { scanf("%d%d%d",&t1,&t2,&t3); e[t1][t2] = t3; e[t2][t1] = t3; } for(int i=1;i<=n;i++) { book[i] = 0; dis[i] = e[1][i]; } int count = 0,sum = 0,min,j; book[1] = 1;//標記該點是否已經在生成樹中 count++; while(count<n) { min = inf; for(int i=1;i<=n;i++) { if(book[i]==0&&dis[i]<min) { min = dis[i]; j = i; } }//從數組dis中找到離生成樹最近的頂點,并加入生成樹中 book[j] = 1; count++; sum+=dis[j];//數組dis表示生成樹到各個頂點的距離 for(int k=1;k<=n;k++)//以J為中間點,更新生成樹到每一個頂點的距離 { if(book[k]==0&&dis[k]>e[j][k]) dis[k] = e[j][k];//此處的松弛操作更改的是中間點到每個點(假如從該點到其他頂點更小的話則更新) } } //由于該算法是層層遞推覆蓋所以會取得最佳效果 printf("%d/n",sum); } return 0;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长丰县| 当阳市| 韩城市| 醴陵市| 长宁区| 灯塔市| 祥云县| 广南县| 梁山县| 蒙山县| 个旧市| 建阳市| 乐东| 西藏| 盘山县| 宜良县| 浦城县| 通江县| 富裕县| 修水县| 湘潭县| 西华县| 峨眉山市| 阳泉市| 郁南县| 闽清县| 陇西县| 当涂县| 新干县| 临西县| 鹤庆县| 法库县| 佳木斯市| 安龙县| 贡觉县| 普安县| 新疆| 沙田区| 城步| 高青县| 通许县|