表示之前一直只会prim,直到这一次专题赛被一道水题给坑了,用点的话太大了,数组开不下来,只好用kruskal,可是又不会。于是一气之下,比赛一结束就叫同学给我讲kruskal,讲完才发现kruskal很简单,相当于并查集。额。。。。多种方法多条路
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn;
const int Maxn;
strcu edge
{
int x,y,l;
bool operator < (const edge a)
{
if(l==a.l)
{
if(x==a.x)
return y<a.y;
return x<a.x;
}
return l<a.l;
}
}
edge side[Maxn];
int fa[maxn];
int find(int x)
{
return (x==fa[x])?x:fa[x]=find(fa[x]);
}
bool union(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx==fy)
return false;
fa[fx]=fy;
return true;
}
int main()
{
int n,m;
int T;
scanf("%d",&T);
while(T--)
{
int ans=0;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
fa[i]=i;
int start,end,length;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&start,&end,&length);
side[i]=(edge){start,end,length};
}
sort(side,side+m);
for(int i=0;i<m;i++)
{
if(union(side[i].x,side[i].y))
{
ans+=side[i].l;
}
}
printf("%d\n",ans);
}
return 0;
}