大地震

并查集}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;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值