Kruskal算法求最小生成树

来源:互联网 发布:node.js base64解码 编辑:程序博客网 时间:2024/05/16 17:54
/*Kruskal*/#include <iostream>#include <algorithm>#include <fstream>using namespace std;typedef struct _edge{    int u;    int v;    int weight;}edge;//varfstream fin;//functionvoid 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--;                 }            }        }    } }

原创粉丝点击