fork download
  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const ll N=2000;
  5. struct ok{
  6. ll v,w,c;
  7. };
  8. vector<ok> g[N+5];
  9. struct ok1{
  10. ll u,kc,x,ma1, ma2;
  11. };
  12.  
  13. struct cmp{
  14. bool operator() (ok1 &a , ok1 &b){
  15. return a.kc>b.kc;
  16. }
  17. };
  18. ll d[N+5][N+5];
  19.  
  20. void siu(ll s){
  21. for(int i=0;i<=N;i++)
  22. for(int j=0;j<=N;j++)
  23. d[i][j]=1e16;
  24.  
  25. priority_queue<ok1, vector<ok1> , cmp> q;
  26. d[s][0]=0;
  27. q.push({s,0,0,0,0});
  28.  
  29. while(!q.empty()){
  30. ok1 x1=q.top();
  31. q.pop();
  32. ll u=x1.u, kc=x1.kc, x=x1.x, ma1=x1.ma1, ma2=x1.ma2;
  33.  
  34. if(kc != d[u][x]) continue;
  35. for(auto v1:g[u]){
  36. ll v=v1.v, w=v1.w , c=v1.c;
  37. if(c==2){
  38. ll ma=max(ma2,w);
  39.  
  40. if(d[v][x+1] > ma+ma1){
  41. d[v][x+1]= ma+ma1;
  42. q.push({v,d[v][x+1],x+1,ma1,ma}); }
  43. }
  44. else{
  45. ll ma=max(ma1,w);
  46. if(d[v][x] > ma+ma2){
  47. d[v][x]=ma+ma2;
  48.  
  49. q.push({v,d[v][x],x,ma,ma2}); }
  50. }
  51. }
  52. }
  53. }
  54. int main(){
  55. ll n,m,s,t;
  56. cin>>n>>m>>s>>t;
  57. ll d1=0;
  58.  
  59. for(int i=1;i<=m;i++){
  60. ll c,u,v,w;
  61. cin>>c>>u>>v>>w;
  62. if(c==2) d1++;
  63. g[u].push_back({v,w,c});
  64. g[v].push_back({u,w,c});
  65. }
  66.  
  67. siu(s);
  68. ll res=1e16;
  69. for(int i=0;i<=d1;i++)
  70. res=min(res,d[t][i]);
  71. cout<<res;
  72. return 0;
  73. }
  74.  
Success #stdin #stdout 0.01s 35160KB
stdin
6 7 1 4
1 1 2 4
2 2 3 7
1 3 4 6
2 1 6 5
1 6 5 5
2 5 4 8
2 2 5 2
stdout
12