最小生成树

来源:互联网 发布:山西八建集团网络平台 编辑:程序博客网 时间:2024/06/06 20:24

prime模板

核心代码:
for(j = 1; j < n; j++)
   {
    if(lowcost[j] != 0 && lowcost[j] > dis[choose] [j] )
 //在这里第一条找到的边是6,那么此时的choose是2,这里的意思就是:
//原点到某一点的距离大于被标记的这一点到其余一点的距离,即使说,原点到这些点都可以更新
//也就是相当于找到2后,然后再更新的时候把1~2的边6给抽掉了,即是说把1~2这条边都当做自己的了
//咦,然后发现3变小了,成了8,哇可以更新!赶紧~~~
     lowcost[j] = dis[choose][j];
   }

 

 

 program:

#include <iostream>
#include <memory>
#include <cmath>
using namespace std;

int const MAX = 110;
int dis[MAX][MAX];
int lowcost[MAX];

int main()
{
int n;
int i,j;

while(cin >> n)
{
for(i = 0; i < n; i++)
   for(j = 0; j < n; j++)
    cin >> dis[i][j];

//下面是prim算法部分,ans是计算所有路径的和
lowcost[0] = 0;
for(i = 1; i < n; i++)
   lowcost[i] = dis[0][i];

int ans = 0;
for(i = 1; i < n; i++)
{
   double min = (1<<30);
   int choose;
   for(j = 1; j < n; j++)
   {
    if(lowcost[j] != 0 && lowcost[j] < min)
    {
     min = lowcost[j];
     choose = j;
    }
   }

   ans += lowcost[choose];
   lowcost[choose] = 0;
   for(j = 1; j < n; j++)
   {
    if(lowcost[j] != 0 && lowcost[j] > dis[choose][j])
     lowcost[j] = dis[choose][j];
   }
}
cout << ans << endl;
}
return 0;
}

kruskal模板

#include <iostream>
#include <memory>
#include <algorithm>
using namespace std;

const int MAX = 1010; //节点个数
const int MAXEDGE = 15010; //边个数
bool used[MAXEDGE]; //标记边是否用过

struct node
{
int begin, end, dis;
}data[MAXEDGE];

class UFSet
{
private:
int parent[MAX+1];
int size;
public:
UFSet(int s = MAX);
int Find(int x);
void Union(int root1, int root2);
};

UFSet::UFSet(int s)
{
size = s+1;
memset(parent, -1, sizeof(int)*size);
}
void UFSet::Union(int root1, int root2)
{
int temp = parent[root1] + parent[root2];
if(parent[root1] <= parent[root2])
{
   parent[root2] = root1; 
   parent[root1] = temp;
}
else
{
   parent[root1] = root2;
   parent[root2] = temp;
}
}
int UFSet::Find(int x)
{
int p = x;
while(parent[p] > 0)
   p = parent[p];

int t = x;
while(t != p)
{
   t = parent[x];
   parent[x] = p;
   x = t;
}
return p;
}

bool cmp(node a, node b)
{
return (a.dis < b.dis);
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
int i,j;

for(i = 0; i < m; i++)
   scanf("%d%d%d", &data[i].begin, &data[i].end, &data[i].dis);

//最小生成树
UFSet ufs(n);
sort(data, data+m, cmp);

int root1, root2;
int total = 0;
for(i = 0; i < m; i++)
{
   root1 = ufs.Find(data[i].begin);
   root2 = ufs.Find(data[i].end);
   if(root1 == root2) continue;
   ufs.Union(root1, root2);
   used[i] = true;
   total++;
   if(total == n-1) break;
}
printf("%d\n%d\n", data[i].dis, n-1);
for(j = 0; j <= i; j++)
   if(used[j])
    printf("%d %d\n", data[j].begin, data[j].end);

return 0;
}

原创粉丝点击