不理解为什么能过……
是数据太水了嘛?
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int inf=INT_MAX;
int n,m,be;
struct Edge{
int v,w,nxt;
}edge[300500];
struct num{
int dis,v;
inline friend bool operator <(num x,num y){
return x.dis>y.dis;
}
};
int Link[105000];
int vis[105000];
int dis[105000];
int ldis[105000];
int len;
void Insert(int xx,int yy,int ww){
edge[++len].v=yy;
edge[len].w=ww,edge[len].nxt=Link[xx];
Link[xx]=len;
}
void dijkstra(int be){
for(int i=1;i<=n;i++){
dis[i]=inf;
ldis[i]=inf;
}dis[be]=0;
priority_queue<num> pq;
pq.push((num){0,be});
while(!pq.empty()){
num tmp=pq.top();
pq.pop();
// if(vis[tmp.v]) continue;
// vis[tmp.v]=1;
for(int i=Link[tmp.v];i;i=edge[i].nxt){
int yy=edge[i].v;
if(dis[yy]>tmp.dis+edge[i].w){
ldis[yy]=dis[yy];
dis[yy]=tmp.dis+edge[i].w;
// if(!vis[yy]){
pq.push((num){dis[yy],yy});
// }
}else if(dis[yy]!=tmp.dis+edge[i].w&&ldis[yy]>tmp.dis+edge[i].w){
ldis[yy]=tmp.dis+edge[i].w;
// if(!vis[yy]){
pq.push((num){ldis[yy],yy});
// }
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
int x,y,z;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
Insert(x,y,z);
Insert(y,x,z);
}
dijkstra(1);
cout<<ldis[n];
return 0;
}