Kruskal算法求最小生成树

/*Kruskal*/
#include <iostream>
#include <algorithm>
#include <fstream>
using namespace std;

typedef struct _edge
{
    int u;
    int v;
    int weight;
}edge;

//var
fstream fin;
//function
void Kruskal(edge *e,int m,int n);
int main()
{
    fin.open("1010.txt",ios::in);
    int n,m;
    fin>>n>>m;
    edge *e=new edge[m];
    for(int i=0;i<m;i++)
    {
        fin>>e[i].u>>e[i].v>>e[i].weight;
        e[i].u--;
        e[i].v--;
    }
    
    Kruskal(e,m,n);
    system("pause");
    return 0;
}

int cmp(const void *a,const void *b)
{
    return (*(edge *)a).weight-(*(edge *)b).weight;
}

//kruskal算法 
void Kruskal(edge *e,int m,int n)
{
    qsort(e,sizeof(e),sizeof(e[0]),cmp);
    int *vertices=new int[n];//计算每个顶点的的分支
    memset(vertices,0,n*sizeof(int));
    int parts=0;
    int u,v;
    for(int i=0;i<m;i++)
    {
        u=e[i].u;
        v=e[i].v;
        if(!vertices[u]&&!vertices[v])
        {
            parts++;
            vertices[u]=parts;
            vertices[v]=parts;  
            cout<<u<<" "<<v<<endl;
        }
        else
        {
            if(vertices[u]&&!vertices[v])
            {
                vertices[v]=vertices[u];
                cout<<u<<" "<<v<<endl;
            }
            else
            {
                if(vertices[v]&&!vertices[u])
                {
                    vertices[u]=vertices[v];
                    cout<<u<<" "<<v<<endl;
                }
                else  if(vertices[u]!=vertices[v])
                {
                    //找到最小的分支 
                    cout<<u<<" "<<v<<endl;
                    int temp1=vertices[u];//小的parts 
                    int temp2=vertices[v];
                    if(vertices[u]>vertices[v])
                    {
                        temp1=vertices[v];
                        temp2=vertices[u]; 
                    }
                    //更新分支
                    for(int j=0;j<n;j++)
                    {
                        if(vertices[j]==temp2)
                           vertices[j]=temp1;
                        else if(vertices[j]>temp2)
                           vertices[j]--;
                    }   
                    parts--; 
                }
            }
        }
    } 
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值