并查集}3、大地震
earthquake.c/cpp/pas
1s/128MB
【题目描述】
在一场大地震后,所有的道路都被破坏掉了,这样就导致了每座城市都被孤立起来了。于是修路的任务刻不容缓。但不幸的是我们只有一支修路队,现在你能求出我们至少要花多长的时间才能让所有城市相连吗?
【输入】
输入文件:earthquake.in
输入的第一行包含两个整数n,m。分别表示城市的数量和道路的数量。
接下来m行每行包含三个整数u,v,w。表示可以花费w的时间修一条连接城市u,v的道路。
输入数据保证一定存在一种修路方案,使得所有城市相连。
【输出】
输出文件:earthquake.out
输出一行,包含一个整数,表示让所有城市相连至少要花多长的时间。
【输入样例】
3 3
1 2 3
2 3 3
3 1 1
【输出样例】
4
【数据范围】
对于100%的数据,1<=n<=1000,1<=m<=n*n
对于100%的数据,1<=u,v<=n,1<=w<=1000
#include<iostream>
#include<algorithm>//裸的最小生成树 简单 但是注意CMP函数不能加if(a.v!=b.v)否则10分还有别用cin cout 用scanf不然一个点过不了
using namespace std;//建议都用scanf如果不是必须用cin时间超
int n,m;
struct node{
int x,y,v;
}f[1000000];
int fa[1000000];
bool cmp(node a,node b){
return a.v<b.v;
}
int find(int a)
{if(fa[a]!=a)fa[a]=find(fa[a]);
return fa[a];
}
void hb(int a,int b)
{int n,m;
n=find(a);
m=find(b);
if(n!=m)
fa[n]=m;
}
void work()
{
int i;
cin>>n>>m;
for(i=1;i<=n;i++)fa[i]=i;
for(i=1;i<=m;i++)
{scanf("%d%d%d",&f[i].x,&f[i].y,&f[i].v);
}
sort(f+1,f+1+m,cmp);
}
int kru()
{
int i,j,k,tot=0,ans=0;
for(i=1;i<=m;i++)
{
j=find(f[i].x);k=find(f[i].y);
if(j!=k)
{hb(j,k);tot++;ans+=f[i].v;if(tot==n-1)break;}
}
return ans;
}
int main()
{
freopen("earthquake.in","r",stdin);
freopen("earthquake.out","w",stdout);
work();
cout<<kru();
//while(1);
return 0;
}