链接:登录—专业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;
}