写了一遍 spfa
发现会Wa两个点,然后感觉是因为这一句没有更新完
dis2[v]=min(dis2[v],dis2[u]+w);
于是又跑了一遍(正着跑),不知道为什么对了
大概因为数据过水,请帮忙hack一下,如果有正确性
麻烦请帮忙解释一下
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
inline int read(){
int u=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){u=u*10+ch-48;ch=getchar();}
return u*f;
}
int n,m;
queue<int>q;
vector<pair<int,int> >vec[500500];
int dis[500500],dis2[500500];
bool vis[500500];
inline void spfa(){
memset(dis,0x3f,sizeof dis);
memset(dis2,0x3f,sizeof dis2);
q.push(1);
vis[1]=1;
dis[1]=0;
while(q.size()){
int u=q.front();q.pop();
vis[u]=0;
for(auto i:vec[u]){
int v=i.first,w=i.second;
if(dis[v]<dis[u]+w){
dis2[v]=min(dis2[v],dis[u]+w);
//cout<<v<<" "<<dis2[v]<<endl;
}
dis2[v]=min(dis2[v],dis2[u]+w);
if(dis[v]>dis[u]+w){
dis2[v]=min(dis2[v],dis[v]);
//cout<<v<<" "<<dis2[v]<<endl;
dis[v]=dis[u]+w;
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
}
memset(dis,0x3f,sizeof dis);
//memset(dis2,0x3f,sizeof dis2);
q.push(1);
vis[1]=1;
dis[1]=0;
while(q.size()){
int u=q.front();q.pop();
vis[u]=0;
for(auto i:vec[u]){
int v=i.first,w=i.second;
if(dis[v]<dis[u]+w){
dis2[v]=min(dis2[v],dis[u]+w);
//cout<<v<<" "<<dis2[v]<<endl;
}
dis2[v]=min(dis2[v],dis2[u]+w);
if(dis[v]>dis[u]+w){
dis2[v]=min(dis2[v],dis[v]);
//cout<<v<<" "<<dis2[v]<<endl;
dis[v]=dis[u]+w;
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
}
}
signed main(){
n=read();m=read();
for(int i=1,u,v,w;i<=m;i++){
u=read();v=read();w=read();
vec[u].push_back({v,w});
vec[v].push_back({u,w});
}
spfa();
cout<<dis2[n]<<endl;
return 0;
}