码迷,mamicode.com
首页 > 其他好文 > 详细

最小生成树

时间:2019-02-11 15:22:42      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:cin   a20   std   code   sizeof   距离   splay   sed   记录   

1.Prim

技术图片
//手写prim 类似于dijkstra 
#include<iostream>
#include<cstring>
using namespace std;
const int INF=0x7fffffff;
const int maxn=100;
int graph[maxn][maxn];
int visit[maxn];
int dist[maxn];
int m,n;
int prime(int cur)
{
    int index;
    int sum = 0;
    memset(visit, 0, sizeof(visit)); //标记未访问的点 
    visit[cur] = true;//当前的点入树 
    for(int i = 0; i < m; i ++){
        dist[i] = graph[cur][i];    //dis记录起始点到各个点之间的距离 
    }
    
    for(int i = 1; i < m; i ++){ //从第二个点开始检测 目的是为了找最小权值 
        
        int mincost = INF; 
        for(int j = 0; j < m; j ++){//遍历所有点 找最短距离及点 
            if(!visit[j] && dist[j] < mincost){ 
                mincost = dist[j];
                index = j;    
            }    
        }
        
        visit[index] = true;//入树操作 
        sum += mincost;
        
        for(int j = 0; j < m; j ++){//更新结点 
            if(!visit[j] && dist[j] > graph[index][j]){
                dist[j] = graph[index][j];
            }    
        }    
    } 
    return sum;    
} 
int main()
{
    int u,v,l;
    cin>>m>>n;
    memset(graph,0x3f,sizeof(graph));
    for(int i=0;i<n;i++){
        cin>>u>>v>>l;
        graph[u-1][v-1]=graph[v-1][u-1]=l;
    }
    cout<<prime(0);
} 
View Code

测试数据;

技术图片
5 6

1 2 5
2 3 5
2 4 12
3 4 17
2 5 15
3 5 6
View Code

2.Kraskal算法

技术图片
#include <iostream>
#include<algorithm>
using namespace std;
 
#define MAX 100
struct edge 
{
    int x,y;
    int w;
}e[MAX];
int fa[MAX];
int rank[MAX];
int sum;
int cmp(edge a,edge b)//排序函数
{
    if(a.w!=b.w)
        return a.w<b.w;
    else 
    {
        return a.x<b.x;
    }
}
void make_set(int x)//初始化节点
{
  fa[x]=x;
  rank[x]=0;
}
 int find(int x)//查找父节点
 {
     return fa[x]==x?x:fa[x]=find(fa[x]);
 }


 void union_set(int x,int y,int w)//合并节点
 {
     if(rank[x]>rank[y])
     {
         rank[y]=x;
     }
     else  if(rank[x]<rank[y])
     {
         rank[x]=y;
     }
     else
     {
      rank[x]++;
      rank[y]=x;
     }
     sum+=w;//总权值加上w
 }
int main()
{
    int x,y,w;
    int m,n;//n是点,m是边
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        cin>>x>>y>>w;
        e[i].x=x;
        e[i].y=y;
        e[i].w=w;
        make_set(x);
        make_set(y);
    }
    sort(e,e+m,cmp);
    sum=0;
    for(int  i=0;i<n;i++)
    {
        x=find(e[i].x);
        y=find(e[i].y);
        w=e[i].w;
        if(x!=y)
        {
            union_set(x,y,w);
        }
    }
    cout<<sum<<endl;
    return 0;
}
View Code

 

最小生成树

标签:cin   a20   std   code   sizeof   距离   splay   sed   记录   

原文地址:https://www.cnblogs.com/helloworld2019/p/10361924.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!