牛客小白月赛6——H挖沟

链接:https://www.nowcoder.com/acm/contest/136/H
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述


    胡队长带领HA实验的战士们玩真人CS,真人CS的地图由一些据点组成,现在胡队长已经占领了n个据点,为了方便,将他们编号为1-n,为了隐蔽,胡队长命令战士们在每个据点出挖一个坑,让战士们躲在坑里。由于需要在任意两个点之间传递信息,两个坑之间必须挖出至少一条通路,而挖沟是一件很麻烦的差事,所以胡队长希望挖出数量尽可能少的沟,使得任意两个据点之间有至少一条通路,顺便,尽可能的∑d[i][j]使最小(其中d[i][j]为据点i到j的距离)。

输入描述:

第一行有2个正整数n,m,m表示可供挖的沟数。
接下来m行,每行3个数a,b,v,每行描述一条可供挖的沟,该沟可以使a与b连通,长度为v。

输出描述:

输出一行,一个正整数,表示要使得任意两个据点之间有一条通路,至少需要挖长的沟。(数据保证有解)

输入

2 2
1 2 1
1 2 3

3 3
1 2 3
2 3 4
1 3 5

输出

1

7

备注:

对于100%的测试数据:
1 ≤ n ≤ 100000
1 ≤ m ≤ 500000
1 ≤ v ≤ 10000

最小生成树算法裸题,,,不过这个题目描述。。。坑死人不偿命

#include <cstdio>
#define ll long long
#define MAXN 100010
#include <algorithm> 
using namespace std;

struct Edge{
	int s,e;
	int val;
} e[MAXN*5];

int pre[MAXN];

bool cmp( Edge aa , Edge bb ){
	return aa.val < bb.val;
}

int find( int x ){
	int i=x;
	while( x != pre[x] )
		x = pre[x];
	int j;
	while( i != x ){
		j = i;
		i = pre[i];
		pre[j] = x;
	}
	return x;
}

int krus( int n , int m ){
	for( int i=0 ; i<=n ; i++ )
		pre[i] = i;
	int sum = 0;
	int ds,de;
	for( int i=0 ; i<m ; i++ ){
		ds = find( e[i].s );
		de = find( e[i].e );
		if( ds == de )
			continue;
		pre[de] = ds;
		sum += e[i].val;
	}
	return sum;
}

int main(){
	int n,m;
	while( ~scanf( "%d%d",&n,&m ) ){
		for( int i=0 ; i<m ; i++ )
			scanf( "%d%d%d",&e[i].s,&e[i].e,&e[i].val );
		sort( e,e+m,cmp );
		printf( "%d\n",krus(n,m) );
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值