分层图建图典题
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define int long long
const int N = 6e5+10;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
int e[N],ne[N],w[N],h[N],idx;
void add(int a,int b,int c){
e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a] = idx++;
}
int n,m;
int dist[N];
bool vis[N];
struct Node{
int id,d;
bool operator<(const Node&W)const{
return d>W.d;
}
};
void dijkstra()
{
memset(dist,0x3f,sizeof dist);
dist[1] = 0;
priority_queue<Node>heap;
heap.push({1,0});
while(heap.size()){
auto t = heap.top();
heap.pop();
int ver = t.id,distance = t.d;
if(vis[ver])continue;
vis[ver] = true;
for(int i=h[ver];~i;i=ne[i]){
int j = e[i];
if(dist[j]>distance+w[i]){
dist[j] = distance + w[i];
heap.push({j,dist[j]});
}
}
}
cout<<dist[n] - min({dist[n],dist[n+n],dist[n+n+n]});
}
void solve()
{
cin>>n>>m;
memset(h,-1,sizeof h);
for(int i=1;i<=m;i++){
int a,b,c,d;cin>>a>>b>>c>>d;
if(d==1){
add(a,b+n,c),add(b,a+n,c);
add(a+n,b+n+n,c),add(b+n,a+n+n,c);
}else{
add(a,b,c),add(b,a,c);
add(a+n,b+n,c),add(b+n,a+n,c);
add(a+n+n,b+n+n,c),add(b+n+n,a+n+n,c);
}
}
dijkstra();
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _;
//cin>>_;
_ = 1;
while(_--)solve();
return 0;
}