#include<iostream>
using namespace std;
int f[1000];
typedef struct node{
int u;
int v;
int w;
}graph;
void sort(graph g[],int m)
{
for(int i=1;i<m;i++)
for(int j=1;j<=m-i;j++)
if(g[j].w>g[j+1].w)
{
graph tt=g[j];
g[j]=g[j+1];
g[j+1]=tt;
}
}
int getf(int u)
{
if(f[u]==u)
return u;
else
{
f[u]=getf(f[u]);
return f[u];
}
}
int merge(int u,int v)
{
int t1,t2;
t1=getf(u);
t2=getf(v);
if(t1!=t2)
{
f[t2]=t1;
return 1;
}
else
return 0;
}
int main()
{
graph g[1000];
int n,m,count=0,sum=0; //n表示顶点数目,m表示边的数目
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>g[i].u>>g[i].v>>g[i].w>>g[i].p;
sort(g,m);
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=m;i++)
{
if(merge(g[i].u,g[i].v))
{
count++;
sum+=g[i].w;
}
if(count==n-1)
break;
}
cout<<sum;
return 0;
}
用并查集来解最小生成树问题
最新推荐文章于 2020-07-21 11:18:19 发布