Tranvick

Pukanus

May 12th, 2014
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.34 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. const int N = 1111;
  8. const int M = 11111;
  9. const int INF = (int)1e9;
  10.  
  11. vector<int> g[N];
  12. int n, m, k, deg[N], x[N], y[N], S, T, c, ef[M], es[M], ev[M], d[M], used[M];
  13.  
  14. void add(int x, int y, int z) {
  15.     es[++c] = y;
  16.     ef[c] = x;
  17.     ev[c] = z;
  18.     g[x].push_back(c);
  19.     es[++c] = x;
  20.     ef[c] = y;
  21.     ev[c] = z;
  22.     g[y].push_back(c);
  23.     ++deg[x];
  24.     ++deg[y];
  25. }
  26.  
  27. void input() {
  28.     scanf("%d%d%d", &n, &m, &k);
  29.     for (int i = 1; i <= n; ++i) {
  30.         scanf("%d%d", &x[i], &y[i]);
  31.     }
  32.     for (int i = 0; i < m; ++i) {
  33.         int x, y, z;
  34.         scanf("%d%d%d", &x, &y, &z);
  35.         add(x, y, z);
  36.     }
  37.     scanf("%d%d", &S, &T);
  38. }
  39.  
  40. int triangleArea(int x1, int y1, int x2, int y2, int x3, int y3) {
  41.     return (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1);
  42. }
  43.  
  44. bool counterClockwise(int x1, int y1, int x2, int y2, int x3, int y3) {
  45.     return triangleArea(x1, y1, x2, y2, x3, y3) > 0;
  46. }
  47.  
  48. void dijkstra() {
  49.     for (int i = 1; i <= c; ++i) {
  50.         d[i] = INF;
  51.     }
  52.     for (int i = 0; i < g[S].size(); ++i) {
  53.         int h = g[S][i];
  54.         int to = es[h];
  55.         int dist = ev[h];
  56.         if (counterClockwise(x[S], y[S] - 1, x[S], y[S], x[to], y[to])) {
  57.             dist += deg[S] * k;
  58.         }
  59.         d[h] = min(d[h], dist);
  60.     }
  61.     for (;;) {
  62.         int u = 0;
  63.         for (int i = 1; i <= c; ++i) {
  64.             if (!used[i] && (!u || d[i] < d[u])) {
  65.                 u = i;
  66.             }
  67.         }
  68.         if (u == 0) {
  69.             break;
  70.         }
  71.         used[u] = true;
  72.         int from = ef[u], v = es[u];
  73.         for (int i = 0; i < g[v].size(); ++i) {
  74.             int h = g[v][i];
  75.             int to = es[h];
  76.             int dist = ev[h];
  77.             if (counterClockwise(x[from], y[from], x[v], y[v], x[to], y[to]) || from == to) {
  78.                 dist += deg[v] * k;
  79.             }
  80.             if (dist + d[u] < d[h]) {
  81.                 d[h] = dist + d[u];
  82.             }
  83.         }
  84.     }
  85. }
  86.  
  87. int main() {
  88.     freopen("input.txt", "r", stdin);
  89.     freopen("output.txt", "w", stdout);
  90.     input();
  91.     dijkstra();
  92.     int res = INF;
  93.     for (int i = 1; i <= c; ++i) {
  94.         if (es[i] == T && d[i] < res) {
  95.             res = d[i];
  96.         }
  97.     }
  98.     printf("%d\n", res);
  99.     return 0;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment