Advertisement
Guest User

Dijkstra

a guest
Feb 9th, 2016
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.87 KB | None | 0 0
  1. #include <utility>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <set>
  5.  
  6. using std :: make_pair;
  7. using std :: vector;
  8. using std :: pair;
  9. using std :: set;
  10.  
  11. set< pair<int, int> > s;
  12. vector< pair<int, int> > g[5005];
  13. int n, m, a[5005], d[5005], p[5005], as, ae, mi = 2e9;
  14.  
  15. int main () {
  16.         scanf ("%d%d", &n, &m);
  17.  
  18.         for (int i = 1; i <= n; i++) {
  19.                 scanf ("%d", &a[i]);
  20.                 if (a[i] == 1) {
  21.                         s.insert (make_pair (0, i));
  22.                         p[i] = i;
  23.                 } else {
  24.                         d[i] = (int) 2e9;
  25.                 }
  26.         }
  27.  
  28.         for (int i = 1; i <= m; i++) {
  29.                 int x, y, cost;
  30.                 scanf ("%d%d%d", &x, &y, &cost);
  31.                 g[x].push_back (make_pair (y, cost));
  32.                 g[y].push_back (make_pair (x, cost));
  33.         }
  34.  
  35.         while (!s.empty ()) {
  36.                 int v = s.begin () -> second;
  37.                 s.erase (s.begin ());
  38.                 for (auto i : g[v]) {
  39.                         int to = i.first;
  40.                         int cost = i.second;
  41.                         if (d[to] > d[v] + cost) {
  42.                                 if (s.count (make_pair (d[to], to))) {
  43.                                         s.erase (make_pair (d[to], to));
  44.                                 }
  45.                                 d[to] = d[v] + cost;
  46.                                 p[to] = p[v];
  47.                                 s.insert (make_pair (d[to], to));
  48.                         }
  49.                 }
  50.         }
  51.  
  52.         for (int i = 1; i <= n; i++) {
  53.                 if (a[i] == 2 && mi > d[i]) {
  54.                         as = p[i];
  55.                         ae = i;
  56.                         mi = d[i];
  57.                 }
  58.         }
  59.  
  60.         if (mi == (int) 2e9) {
  61.                 puts ("-1");
  62.         } else {
  63.                 printf ("%d %d %d\n", as, ae, mi);
  64.         }
  65.  
  66.         return 0;
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement