今天打一道最小生成树的水题,但是自己犯了个错误(不该啊),看来是最近的题目打了太少了。
模板:
#include <bits/stdc++.h>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
typedef long long ll ;
const ll maxn = 1e5+10;
struct node
{
ll x,y;
ll dis;
}s[maxn];
ll pre[maxn];
ll sum,num;
ll n,m;
//这里的sum记录的是满足条件(即:刚好链接全部的权值之和)
//num是指记录的点的个数(一般指的是城市之类等)
ll cmp(node a,node b)
{
return a.dis<b.dis;
}
void init()
{
for(ll i=1;i<=n;i++)
pre[i]=i;
}
ll find(ll x)
{
if(x!=pre[x])
pre[x]=find(pre[x]);
return pre[x];
}
void join(ll x,ll y,ll dis)
{
ll fx=find(x);
ll fy=find(y);
if(fx!=fy)
{
pre[fx]=fy;
sum+=dis;//注意,一旦符合条件,就更新sum以及num值
num++;
}
}
int main()
{
//init();自己把初始化一开始放在了这里,结果就跪了,一开始还以为之是自己的并查集写错!!!不该啊!
sum=0;
num=0;
scanf("%lld%lld",&n,&m);
init();
for(ll i=0;i<m;i++)
scanf("%lld%lld%lld",&s[i].x,&s[i].y,&s[i].dis);
sort(s,s+m,cmp);
for(ll i=0;i<m;i++)
{
join(s[i].x,s[i].y,s[i].dis);
if(num==n-1)
break;
}
printf("%lld\n",sum);
}