利用求单源最短路径的方法,超时了,得了90分
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
struct Node{
int y;
ll day;
Node(){}
Node(int a,ll b){
y = a;
day = b;
}
};
vector<Node>v[maxn];
ll dis[maxn];
int vis[maxn];
void spfa(int S);
int N,M;
int main()
{
cin>>N>>M;
int x,y;
ll day;
for(int i=0;i<M;i++){
cin>>x>>y>>day;
v[x].push_back(Node(y,day));
v[y].push_back(Node(x,day));
}//现在图建立好了
spfa(1);
printf("%d\n",dis[N]);
return 0;
}
void spfa(int S)
{
fill(dis+1,dis+N+1,1e18);
fill(vis+1,vis+N+1,0);
queue<int>q;
q.push(S);
vis[S] = 1;
dis[S] = 0;
while(!q.empty()){
int t = q.front();
q.pop();
vis[t] = 0;
for(int i=0;i<v[t].size();i++){
int y = v[t][i].y;
int day = max(v[t][i].day,dis[t]);
if(dis[y] > day){
dis[y] = day;
if(!vis[y]){
vis[y] = 1;
q.push(y);
}
}
}
}
return ;
}
利用最小生成树的思想,没有超时
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
struct Node{
int x,y,day;
Node(){}
Node(int a,int b,int c){
x = a;
y = b;
day = c;
}
};
bool cmp(Node a,Node b)
{
return a.day < b.day;
}
void init(int N);
int find(int x);
vector<Node> v;
int fa[maxn],N,M;
int main()
{
cin>>N>>M;
init(N);
int x,y,day;
for(int i=0;i<M;i++){
cin>>x>>y>>day;
v.push_back(Node(x,y,day));
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<v.size();i++){
int fx= find(v[i].x);
int fy = find(v[i].y);
if(fy!=fx){
fa[fy] = fx;
}
if(find(1) == find(N)){
cout<<v[i].day<<endl;
break;
}
}
return 0;
}
int find(int x)
{
if(fa[x] == x){
return x;
}else{
return fa[x] = find(fa[x]);
}
}
void init(int N)
{
for(int i=1;i<=N;i++){
fa[i] = i;
}
return ;
}