链接: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) );
}
}