直接存下入边在队里,枚举出边,取max加入点权 求指教
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
struct Dj{
int dis,nh,bh;//dis,点编号,从哪条边来的编号
bool friend operator <(Dj x,Dj y){
return x.dis>y.dis;
}
};
int wei[2*N];
vector<int> to[N];
map<pair<int,int> ,int> bq;
int d[N];
bool vis[N];
int n,m,nn,ans=9999999;
int main(){
cin>>n>>m;
memset(d,127,sizeof(d));
for(int i=1;i<=m;i++){
int p1,p2,we;
cin>>p1>>p2>>we;
to[p1].push_back(p2);
to[p2].push_back(p1);
bq[make_pair(p1,p2)]=i;
bq[make_pair(p2,p1)]=i;
wei[i]=we;
}
// for(int i=1;i<=n;i++){
// to[i].push_back(n+1);
// to[0].push_back(i);
// }
priority_queue<Dj> q;
q.push({0,1,0});
d[1]=0;
while(!q.empty()){
Dj nw=q.top();
q.pop();
//cout<<nw.dis<<' '<<nw.nh<<' '<<nw.bh<<'\n';
if(nw.nh==n){
ans=min(ans,d[n]+wei[nw.bh]);
//break;
}
if(vis[nw.nh]){
continue;
}
vis[nw.nh]=1;
auto &v=to[nw.nh];
for(int i=0;i<v.size();i++){
if(!vis[v[i]]){
int nbq=bq[make_pair(nw.nh,v[i])];
if(d[v[i]]>d[nw.nh]+max(wei[nw.bh],wei[nbq])){
d[v[i]]=d[nw.nh]+max(wei[nw.bh],wei[nbq]);
}
q.push({d[v[i]],v[i],nbq});
nn=nbq;
}
}
}
cout<<ans;
return 0;
}