问题描述
试题编号: | 201703-4 |
试题名称: | 地铁修建 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁。 输入格式 输入的第一行包含两个整数n, m,用一个空格分隔,分别表示交通枢纽的数量和候选隧道的数量。 输出格式 输出一个整数,修建整条地铁线路最少需要的天数。 样例输入 6 6 样例输出 6 样例说明 可以修建的线路有两种。 评测用例规模与约定 对于20%的评测用例,1 ≤ n ≤ 10,1 ≤ m ≤ 20; |
最短路就行,只有一条路可以到达的点保存当前最大值,多条路可以到达的保存各种最大值中的最小值
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
typedef pair<int,int> P;
typedef struct node{
int x,num;
}node;
const int INF=1<<29;
node no[100000+10];
vector<node> vec[100000+10];
int len[100000+10],v[100010];
int n,m;
void dij(int x){
for(int i=0;i<=n;i++) len[i]=INF,v[i]=0;
len[x]=0;
priority_queue<P,vector<P>, greater<P> > que;
que.push({len[x],x});
while(que.size()){
P p=que.top();
que.pop();
int num=p.second;
if(v[num]) continue;
v[num]=1;
for(int i=0;i<vec[num].size();i++){
int next=vec[num][i].x;
int day=vec[num][i].num;
int fz=max(day,len[num]);
//cout<<day<<endl;
if(len[next]>fz){
len[next]=fz;
que.push({len[next],next});
}
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
vec[a].push_back({b,c});
vec[b].push_back({a,c});
}
dij(1);
cout<<len[n];
return 0;
}
最小生成树也OK
每次拉进最短的边,如果1号和n号连通,说明当前就是连接的最短天数
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
typedef struct node{
int x,y,num;
}node;
node no[200001];
int father[100001];
bool cmp(node n1,node n2){
return n1.num<n2.num;
}
int find(int x){
if(x==father[x]) return x;
return father[x]=find(father[x]);
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<=n;i++) father[i]=i;
for(int i=0;i<m;i++){
int a,b,c;
scanf("%d%d%d",&no[i].x,&no[i].y,&no[i].num);
}
sort(no,no+m,cmp);
int out=0;
for(int i=0;i<m;i++){
int x=find(no[i].x);
int y=find(no[i].y);
if(x!=y){
out=max(out,no[i].num);
father[x]=y;
}
if(find(1)==find(n)){
cout<<out<<endl;
break;
}
}
return 0;
}
欢迎大家加入 早起学习群,一起学习一起进步!(群号:642179511)