在VScode上跑出RE,洛谷IDE上能输出。
/* ChongYun */
#include<bits/stdc++.h>
#define int long long
using namespace std;
int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*f;
}
const int inf=1e12;
int n,m;
int u[100005],v[100005];
struct graph{
struct Edge{
int to,nxt,val;
}w[200005];
int hd[100005],ecnt=0;
void Link(int x,int y,int val){
++ecnt;
w[ecnt].to=y;
w[ecnt].nxt=hd[x];
w[ecnt].val=val;
hd[x]=ecnt;
return ;
}
}G1,G2,G3;
int flg[100005],vi[100005],lst[100005];
int dis[100005],vis[100005];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
void dijkstra(graph G){
for(int i=1;i<=n;i++) lst[i]=0;
for(int i=1;i<=n;i++) vis[i]=0;
for(int i=1;i<=n;i++) dis[i]=inf;
dis[1]=0; q.push({0,1});
while(!q.empty()){
int x=q.top().second;
q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=G.hd[x];i!=0;i=G.w[i].nxt){
int y=G.w[i].to;
if(dis[y]>dis[x]+G.w[i].val){
dis[y]=dis[x]+G.w[i].val;
lst[y]=x;
if(!vis[y]) q.push({dis[y],y});
}
}
}
return ;
}
signed main(){
n=read(); m=read();
for(int i=1;i<=m;i++){
int val1,val2;
u[i]=read(); v[i]=read();
val1=read(); val2=read();
G1.Link(u[i],v[i],val1),G1.Link(v[i],u[i],val1);
G2.Link(u[i],v[i],val2),G2.Link(v[i],u[i],val2);
}
dijkstra(G1);
int now=n; flg[1]=flg[n]=1;
while(now){
flg[now]=1;
now=lst[now];
}
for(int i=1;i<=m;i++){
if(flg[u[i]]&&flg[v[i]]) ++vi[i];
}
for(int i=1;i<=n;i++) flg[i]=0;
dijkstra(G2);
now=n; flg[1]=flg[n]=1;
while(now){
flg[now]=1;
now=lst[now];
}
for(int i=1;i<=m;i++){
if(flg[u[i]]&&flg[v[i]]) ++vi[i];
}
for(int i=1;i<=m;i++){
G3.Link(u[i],v[i],vi[i]);
G3.Link(v[i],u[i],vi[i]);
}
dijkstra(G3);
printf("%lld\n",dis[n]);
return 0;
}