挖沟牛客网

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述


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

2 2
1 2 1
1 2 3

输出

复制1

1

示例2

输入

复制3 3 1 2 3 2 3 4 1 3 5

3 3
1 2 3
2 3 4
1 3 5

输出

复制7

7

 prim算法:

#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>

using namespace std;


int n,m;

struct ty
{
	int t,next,w;
};

ty edge[2*500000+10];
int head[500010];
int cnt;
int intree[500010];
int ans;

void addedge(int x,int y,int z)
{
	edge[++cnt].t=y;
	edge[cnt].w=z;
	edge[cnt].next=head[x];
	head[x]=cnt;	
}

struct ty2
{
   int x,len;
   bool operator <(const ty2 &a)const
   {
   	return len>a.len;
   }
   
};

priority_queue<ty2>q;

int prim()
{
	ty2 tmp;
	intree[1]=1;
	for(int i=head[1];i!=-1;i=edge[i].next)
	{
		tmp.x=edge[i].t;
		tmp.len=edge[i].w;
		q.push(tmp);	
	}
	
	while(!q.empty())
	{
		ty2 tmp;
		tmp=q.top();
		q.pop();
		int x=tmp.x;
		if(intree[x])continue;
		intree[x]=1;
		ans+=tmp.len;
		for(int i=head[x];i!=-1;i=edge[i].next)
		{
			int y=edge[i].t;
			if(intree[y])continue;
			tmp.x=y;
			tmp.len=edge[i].w;
			q.push(tmp);
		}
	}
	return ans;
}

int main()
{
	memset(head,-1,sizeof(head));
	cin>>n>>m;
	int a,b,c;
	for(int i=1;i<=m;++i)
	{
		cin>>a>>b>>c;
		addedge(a,b,c);
		addedge(b,a,c);
	}
	cout<<prim()<<endl;
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值