列表

详情


NC17509. 挖沟

描述


    胡队长带领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。

输出描述

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

示例1

输入:

2 2
1 2 1
1 2 3

输出:

1

示例2

输入:

3 3
1 2 3
2 3 4
1 3 5

输出:

7

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java 解法, 执行用时: 1567ms, 内存消耗: 33624K, 提交时间: 2023-08-13 14:02:04

import java.util.*;
import java.io.*;
public class Main {
	static int[] p=new int[100010];
	public static void main(String[] args) throws NumberFormatException, IOException {
        Read sc=new Read();
        int n=sc.nextInt();
        int m=sc.nextInt();
        Edge[] edges=new Edge[m];
        for(int i=1;i<=n;i++)p[i]=i;
        for(int i=0;i<m;i++) {
        	edges[i]=new Edge(sc.nextInt(), sc.nextInt(), sc.nextInt());
        }
        Arrays.sort(edges,new Comparator<Edge>() {
        	public int compare(Edge e1,Edge e2) {
        		return e1.c-e2.c;
        	}
		});
        
        long res=0;
        for(int i=0;i<m;i++) {
        	int a=edges[i].a;
        	int b=edges[i].b;
        	if(find(a)!=find(b)) {
        		res+=edges[i].c;
        		p[find(a)]=find(b);
        	}
        }
        System.out.println(res);
	}
	static int find(int x) {
		if(x!=p[x])p[x]=find(p[x]);
		return p[x];
	}
}
class Edge{
	int a,b,c;
	public Edge(int a,int b,int c) {
		this.a=a;
		this.b=b;
		this.c=c;
	}
	
}
class Read{
	StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	int nextInt() throws IOException {
		st.nextToken();
		return (int)st.nval;
	}
	String next() throws IOException {
		st.nextToken();
		return st.sval;
	}
}

C++ 解法, 执行用时: 250ms, 内存消耗: 6612K, 提交时间: 2023-08-13 14:01:34

#include<bits/stdc++.h>
using namespace std;

struct h
{
	int x,y,w;
}E[500005];
int i,S=0,n,m,V[100005];
int F(int x)
{
	if(V[x]!=x)return V[x]=F(V[x]);
	return x;
}
void U(int x,int y)
{
	int a=F(x),b=F(y);
	if(a!=b)V[a]=b;
}
bool cmp(h a,h b)
{
	return a.w<b.w;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(i=0;i<m;i++)scanf("%d%d%d",&E[i].x,&E[i].y,&E[i].w);
	sort(E,E+m,cmp);
	for(i=1;i<=n;i++)V[i]=i;
	for(i=0;i<m;i++)
		if(F(E[i].x)!=F(E[i].y))U(E[i].x,E[i].y),S+=E[i].w;
	printf("%d\n",S);
}

上一题