题目不难。有点经验的看数据都知道怎么做了。
题目数据给的是边的信息,很显然kruscal可以直接上
题目数据给的是边的信息,很显然kruscal可以直接上
#include <cstdio>
#include <algorithm>
using namespace std;
typedef struct //存边信息
{
int x,y,w;
}node;
bool cmp(const node a,const node b)
{
return a.w<b.w;
}
int root[2600];
int main()
{
void init_set(int x);
int find_set(int x);
void union_set(int x,int y);
void kruskal(int n,int m,node edge[]);
int n,m;
node edge[2600];
while(scanf("%d",&n)&&n)
{
scanf("%d",&m);
for(int i = 0 ; i < m ; i++ )
{
scanf("%d %d %d",&edge[i].x,&edge[i].y,&edge[i].w);
}
init_set(n);
kruskal(n,m,edge);
}
return 0;
}
void init_set(int x) //并查集操作
{
for(int i = 1 ; i <=x; i++)
{
root[i]=i;
}
}
int find_set(int x)
{
if(x!=root[x])
{
root[x]=find_set(root[x]);
}
return root[x];
}
void union_set(int x,int y)
{
int a=find_set(x);
int b=find_set(y);
if(a!=b)
{
root[a]=b;
}
}
void kruskal(int n,int m,node edge[]) //算出最小生成树
{
int minspace=0;
sort(edge,edge+m,cmp);
for(int i = 0;i<m; i++)
{
if(find_set(edge[i].x) != find_set(edge[i].y))
{
minspace+=edge[i].w;
union_set(edge[i].x,edge[i].y);
}
}
printf("%d\n",minspace);
}