MinhNGUYEN2k4

BINLADEN || DIJKSTRA

Jan 17th, 2021 (edited)
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.78 KB | None | 0 0
  1. //Nguyen Huu Hoang Minh
  2. #include <bits/stdc++.h>
  3. #define sz(x) int(x.size())
  4. #define all(x) x.begin(),x.end()
  5. #define reset(x) memset(x, 0,sizeof(x))
  6. #define pb push_back
  7. #define mp make_pair
  8. #define fi first
  9. #define se second
  10. #define N 22299
  11. #define remain(x) if (x > MOD) x -= MOD
  12. #define ii pair<int, int>
  13. #define vi vector<int>
  14. #define vii vector< ii >
  15. #define bit(x, i) (((x) >> (i)) & 1)
  16. #define Task "test"
  17. #define int long long
  18.  
  19. using namespace std;
  20.  
  21. typedef long double ld;
  22.  
  23. int n,m;
  24. int node = 0;
  25. int st, en;
  26. int d[2222*10+999];
  27. vector<ii> a[N];
  28. int even[2225][15];
  29. int odd[2225][15];
  30.  
  31. void readfile()
  32. {
  33.     ios_base::sync_with_stdio(false);
  34.     cin.tie(0);cout.tie(0);
  35.     if (fopen(Task".inp","r"))
  36.     {
  37.         freopen(Task".inp","r",stdin);
  38.         //freopen(Task".out","w",stdout);
  39.     }
  40.     cin >> m >> n;
  41.     st = 1;
  42.     en = (m+1)*n;
  43.     for(int i=1; i<=2*m; i++)
  44.     {
  45.         if (i%2){
  46.             int floor = i/2 + 1;
  47.             for(int j=1; j<=n; j++) cin >> even[floor][j];
  48.         }
  49.         else{
  50.             int floor = i/2;
  51.             for(int j=1; j<n; j++) cin >> odd[floor][j];
  52.         }
  53.     }
  54.     for(int i=1; i<=m; i++)
  55.     {
  56.         for(int j=1; j<=n; j++)
  57.         {
  58.             int u = i*n + j;
  59.             int uup = (i-1)*n + j;
  60.             a[u].pb(ii(uup,even[i][j]));
  61.             a[uup].pb(ii(u,even[i][j]));
  62.             int udown = (i+1)*n+j;
  63.             a[u].pb(ii(udown,even[i+1][j]));
  64.             a[udown].pb(ii(u,even[i+1][j]));
  65.             if (j==1){
  66.                 int v = u+1;
  67.                 a[u].pb(ii(v,odd[i][j]));
  68.                 a[v].pb(ii(u,odd[i][j]));
  69.             }
  70.             else if (j==n)
  71.             {
  72.                 int v = u-1;
  73.                 a[u].pb(ii(v,odd[i][j-1]));
  74.                 a[v].pb(ii(u,odd[i][j-1]));
  75.             }
  76.             else{
  77.                 int v = u+1;
  78.                 a[u].pb(ii(v,odd[i][j]));
  79.                 a[v].pb(ii(u,odd[i][j]));
  80.                 v = u-1;
  81.                 a[u].pb(ii(v,odd[i][j-1]));
  82.                 a[v].pb(ii(u,odd[i][j-1]));
  83.             }
  84.         }
  85.     }
  86. }
  87.  
  88. void dijkstra()
  89. {
  90.     priority_queue<ii, vii, greater<ii>> q;
  91.     for(int i=1; i<=en; i++) d[i] = 99999999999;
  92.     for(int i=1; i<=n; i++) d[i] = 0, q.push(ii(0,i));
  93.     while (q.size())
  94.     {
  95.         int u = q.top().se;
  96.         int du = q.top().fi;
  97.         q.pop();
  98.         if (du != d[u]) continue;
  99.         for(auto i : a[u])
  100.         {
  101.             int v = i.fi;
  102.             int uv = i.se;
  103.             if (d[v] > d[u] + uv)
  104.             {
  105.                 d[v] = d[u] + uv;
  106.                 q.push(ii(d[v],v));
  107.             }
  108.         }
  109.     }
  110. }
  111.  
  112. void proc()
  113. {
  114.     dijkstra();
  115.     cout << d[en];
  116. }
  117.  
  118. signed main()
  119. {
  120.     readfile();
  121.     proc();
  122.     return 0;
  123. }
  124.  
Add Comment
Please, Sign In to add comment