#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define MAXV 1000
#define MaxSize 100
#define INF 20000
typedef struct EDGE
{
int u;
int v;
int w;
}Edge;
typedef struct
{
int edges[MAXV][MAXV];
int n,e;
int vex[MAXV];
}MGraph;
typedef struct
{
int data;
int rank;
int parent;
}UFSTree;
void MAKE_SET(UFSTree t[],int n)
{
int i;
for(i=0; i<n; i++)
{
t[i].rank=0;
t[i].parent=i;
}
}
int FIND_SET(UFSTree t[],int x)
{
if(x!=t[x].parent)
return FIND_SET(t,t[x].parent);
else return x;
}
void UNION(UFSTree t[], int x, int y)
{
x=FIND_SET(t,x);
y=FIND_SET(t,y);
if(t[x].rank>t[y].rank)
t[y].parent=x;
else
{
t[x].parent=y;
if(t[x].rank==t[y].rank)
t[y].rank++;
}
}
int camp(const void *a,const void *b)
{
struct EDGE *c= (EDGE*)a;
struct EDGE *d= (EDGE*)b;
if(c->w!=d->w)
return c->w-d->w;
if(c->v!=d->v)
return c->v=d->v;
return c->w-d->w;
}
void Kruscal(MGraph g)
{
int i,j,k,u1,v1,sn1,sn2;
UFSTree t[MaxSize];
Edge E[MaxSize];
k=1;
for(i=0; i<g.n; i++)
for(j=0; j<g.n; j++)
if(g.edges[i][j]!=0&&g.edges[i][j]!=INF)
{
E[k].u=i; E[k].v=j; E[k].w=g.edges[i][j];
k++;
}
qsort( E, g.e,sizeof(Edge),camp );
MAKE_SET( t, g.n);
k=1;
j=1;
while(k<g.n)
{
u1=E[j].u;
v1=E[j].v;
sn1=FIND_SET(t, u1);
sn2=FIND_SET(t, v1);
if(sn1 != sn2)
{
printf("(%d,%d) : %d\n",u1, v1, E[j].w);
k++;
UNION(t, u1, v1);
}
j++;
}
}
int main()
{
MGraph g;
int i,j,u,v,w;
scanf("%d", &g.n);
for(i=0; i<g.n; i++)
for(j=0 ;j<g.n; j++)
{if(i==j)
g.edges[i][j]=0;
else g.edges[i][j]=g.edges[j][i]=INF;
}
for(i=0; i<g.n; i++)
for(j=0 ;j<g.n; j++)
{
scanf("%d %d %d",&u,&v,&w);
g.edges[j][i]=g.edges[i][j]=w;
}
Kruscal(g);
system("pause");
return 0;
}
最小生成树
最新推荐文章于 2025-04-18 23:13:20 发布