貪心法——最小生成樹

Prime算法

/*
* problem: 最小生成樹
* method: 貪心法(最近點策略prime)
* date: 2020/05/12
*/
#include<iostream>
using namespace std;
const int INF=10e5;
const int MAX_N=20;
typedef struct {
 int adjvex;
 int lowcost;
} Element;
int arc[MAX_N][MAX_N]= {
 {INF,34,46,INF,INF,19},
 {34,INF,INF,INF,12,INF},
 {46,INF,INF,17,INF,25},
 {INF,INF,17,INF,38,25},
 {INF,12,INF,38,INF,26},
 {19,INF,25,25,26,INF}
};
Element shortEdge[MAX_N];
int n=6;
void Prime(int x) {
 int i,j,k,min;
 for(i=0; i<n; i++) {//從頂點x開始
  shortEdge[i].adjvex=x;
  shortEdge[i].lowcost=arc[x][i];
 }
 shortEdge[x].lowcost=0;
 for(i=0; i<n-1; i++) {
  min=INF;
  for(j=0; j<n; j++) {
   if(shortEdge[j].lowcost!=0&&shortEdge[j].lowcost<min) {
    min=shortEdge[j].lowcost;
    k=j;
   }
  }
  cout<<shortEdge[k].adjvex<<"--"<<k<<endl;
  shortEdge[k].lowcost=0;
  for(j=0; j<n; j++) {
   if(shortEdge[j].lowcost!=0&&arc[j][k]!=0&&arc[j][k]<shortEdge[j].lowcost) {
    shortEdge[j].lowcost=arc[j][k];
    shortEdge[j].adjvex=k;
   }
  }
 }
}
int main() {
 Prime(0);
 return 0;
}

Kruskal

/*
* problem: 最小生成樹
* method: 貪心法(最短邊策略Kruskal)、並查集
* date: 2020/05/12
*/
#include<iostream>
#include<utility>
using namespace std;
const int INF=10e5;
const int MAX_N=20;
typedef struct {
 int adjvex;
 int lowcost;
} Element;
int arc[MAX_N][MAX_N]= {
 {INF,34,46,INF,INF,19},
 {34,INF,INF,INF,12,INF},
 {46,INF,INF,17,INF,25},
 {INF,INF,17,INF,38,25},
 {INF,12,INF,38,INF,26},
 {19,INF,25,25,26,INF}
};
char t[MAX_N]="ABCDEFGH";
int flag[MAX_N][MAX_N];
int f[MAX_N];
int n=6;
int F(int a) {
 int b=a;
 while(a!=f[a]) {
  a=f[a];
 }
 return a;
}
pair<int,int> Search() {
 int a,b,min=INF;
 for(int i=0; i<n; i++) {
  for(int j=0; j<i; j++) {
   if(!flag[i][j]&&arc[i][j]<min) {
    min=arc[i][j];
    a=i;
    b=j;
   }
  }
 }
 return pair<int,int>(a,b);
}
void Kruskal() {
 int i,j;
 for(i=0; i<n; i++) {
  f[i]=i;
 }
 for(i=0; i<n-1;) {
  pair<int,int> p=Search();
  if(F(p.first)!=F(p.second)) {
   cout<<t[p.first]<<"--"<<t[p.second]<<":"<<arc[p.first][p.second]<<endl;
   f[F(p.second)]=F(p.first);
   i++;
  }
  flag[p.first][p.second]=1;
  flag[p.second][p.first]=1;
 }
}
int main() {
 Kruskal();
 return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章