一道CSP的考题:201812-4
正如学长所说,CSP的题目确实很绕,不过仔细分析题目、读出他的考察点才是解题的关键
主要思路:
“每个节点需要选择一条路劲将数据发送到root节点”、“最优的树结构传输图”、“完成任务所需时间最少”、“root只接收数据,其他节点可以接受多个节点的数据,只能传输给一个节点”
结合题目中的表述以及样例,我们需要求出所有生成树中这样的一棵,其最大边权尽可能小,即求出最小瓶颈树的最大边权,而MST正是一棵最小瓶颈树,于是问题转化为求最小生成树的最大边
与C题类似,再进行kruskal时我们只需记录最大边的信息即可
D - 数据中心
Sample Input
4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2
Sample Output
4
A Possible Solution
#include<stdio.h>
#include<algorithm>
using namespace std;
struct Edge{
int u,v,w;
bool operator < (const Edge& e) const {
return w<e.w;
}
};
int n,m,root,size=0;
int par[50005];
Edge edge[100005];
int Find(int target){
if(target==par[target])
return target;
return par[target]=Find(par[target]);
}
bool Union(int x,int y){
x=Find(x);
y=Find(y);
if(x==y)
return false;
else{
par[x]=y;
return true;
}
}
int main(){
scanf("%d %d %d",&n,&m,&root);
for(;size<m;size++){
scanf("%d %d %d",&(edge[size].u),&(edge[size].v),&(edge[size].w));
}
for(int i=1;i<=n;i++)
par[i]=i;
sort(edge,edge+size);
int ans=0,cnt=0;
for(int i=0;i<size;i++){
if(Union(edge[i].u,edge[i].v)){
if(ans<edge[i].w)
ans=edge[i].w;
cnt++;
}
if(cnt==n-1){
printf("%d\n",ans);
break;
}
}
// printf("{%d, %d, %d}\n",edge[i].u,edge[i].v,edge[i].w);
return 0;
}