#include"Graph.h"
#include<assert.h>
#include<iostream>
#include<fstream>
#include<limits>
using namespace std;
const int MAX=std::numeric_limits<int>:: max();
struct Edge
{
int v1;
int v2;
int weight;
};
inline int cmp(const void *p1,const void *p2)
{
Edge *e1=(Edge *)p1;
Edge *e2=(Edge *)p2;
return e1->weight -e2->weight;
}
int *UFSet;
int find(int v)
{
int p=v;
while(UFSet[p]!=p)
{
p=UFSet[p];
}
while(UFSet[v]!=p)
{
int temp=v;
v=UFSet[v];
UFSet[temp]=p;
}
return p;
}
void Union(int r1,int r2)
{
UFSet[r2]=r1;
}
int main()
{
ifstream cin("input.txt");
int vertex_num=7;
Graph<char,int> myGraph(vertex_num);
myGraph.Init(cin);
//myGraph.RandInit();
int edge_num=0;
Edge *edges=new Edge[vertex_num*vertex_num/2];
for(int i=1;i<vertex_num;i++)
{
for(int j=0;j<i;j++)
{
int weight=myGraph.getWeight(i,j);
if(weight>0&&weight<MAX)
{
edges[edge_num].v1=i;
edges[edge_num].v2=j;
edges[edge_num].weight=weight;
edge_num++;
}
}
}
qsort(edges,edge_num,sizeof(Edge),cmp);
UFSet=new int[vertex_num];
for(int i=0;i<vertex_num;i++)
{
UFSet[i]=i;
}
int from=0;
int n=0;
for(int i=from;i<edge_num&&n<vertex_num-1;i++)
{
int r1=find(edges[i].v1);
int r2=find(edges[i].v2);
from=i+1;
if(r1!=r2)
{
Union(r1,r2);
n++;
cout<<edges[i].v1<<" "<<edges[i].v2<<" "<<edges[i].weight<<endl;
}
}
return 0;
}
kruscal求最小生成树
最新推荐文章于 2023-10-13 13:42:36 发布