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--; } } } } }