#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#pragma GCC optimize("O3")
#define x first
#define y second
vector<vector<pair<int,int>>> cad;
vector<unordered_map<int,ll>> c2;
vector<pair<ll,ll>> E;
ll n,m;
struct st{
ll cost,node,ed;
friend bool operator < (st a, st b)
{
return a.cost>b.cost;
}
};
ll cmc()
{
vector<unordered_map<int,ll>> v(cad.size());
priority_queue<st>q;q.push({1,1,(ll)m+1});
while(!q.empty())
{
st temp=q.top();q.pop();
//cerr<<temp.node<<" "<<temp.cost<<"\n";
if(v[temp.node][temp.ed]==0)
{
if(temp.node==n) return temp.cost-1;
v[temp.node][temp.ed]=temp.cost;
for(auto i:cad[temp.node])
{
ll cnt=c2[temp.node][E[i.y].x]-E[i.y].y;
if(E[temp.ed].x==E[i.y].x)
cnt-=E[temp.ed].y;
if(v[i.x][m+1]==0)
q.push({temp.cost+cnt,i.x,(ll)m+1});
if(v[i.x][i.y]==0)
q.push({temp.cost+E[i.y].y,i.x,i.y});
}
}
}
return 1e16;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
cad.resize(n+1);
c2.resize(n+1);
E.resize(m+2);
for(int i=0; i<m; i++)
{
ll a,b;
cin>>a>>b>>E[i].x>>E[i].y;
cad[a].push_back({b,i});
cad[b].push_back({a,i});
c2[a][E[i].x]+=E[i].y;
c2[b][E[i].x]+=E[i].y;
}
ll t1=cmc();
if(t1==1e16) t1=-1;
cout<<t1;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |