CCF-CSP 201703-4地铁修建 并查集+Kruskal算法 满分题解
题目链接:201703-4地铁修建
思路:
1. 由于所有的隧道同时开始修建,则当需要花费时间最长的隧道的时间值最小时,即为修建整条地铁线路最少的时间。
2. 采用最小生成树思想,运用Kruskal算法即可求解。
3. 采用并查集思想,当第一个点和最后一个点在同一个集合时,表明此时隧道已经修建 完毕,输出最后完成的隧道所需天数即可。
具体代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 4e6+10;
int n,m;
int p[N];//存点的祖宗节点
struct Edge{
int a,b,c;
bool operator <(const Edge x)const{
return c<x.c;//按照长度从小到大排序
}
}edges[N];
int find(int x)//并查集
{
if(p[x]!=x)p[x]=find(p[x]);
return p[x];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)p[i]=i;//初始化祖宗节点
for(int i=1;i<=m;i++)
{
int a,b,c;
cin>>a>>b>>c;
edges[i]={a,b,c};
}
sort(edges+1,edges+m+1);//排序
for(int i=1;i<=m;i++)
{
int a=edges[i].a;
int b=edges[i].b;
int c=edges[i].c;
a=find(a);b=find(b);
if(a!=b)//当两个点不在一个集合里时
{
p[a]=b;//将两个点合并到一个集合中
if(find(1)==find(n))//如果此时第一个节点和最后一个节点已经相连
{
cout<<c<<endl;
break;
}
}
}
return 0;
}
//6 6
//1 2 4
//2 3 4
//3 6 7
//1 4 2
//4 5 5
//5 6 6