比赛 平凡的题目 评测结果 ATTTA
题目名称 平凡的皮卡丘 最终得分 40
用户昵称 璞瑞 运行时间 3.015 s
代码语言 C++ 内存使用 7.97 MiB
提交时间 2015-11-03 11:12:37
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long int i64;
  4. template<class T> inline bool mint(T& a, T b) { return a > b ? a = b, true : false; }
  5. template<class T> inline bool maxt(T& a, T b) { return a < b ? a = b, true : false; }
  6.  
  7. const int maxn = 100333;
  8.  
  9. #ifdef WINVER
  10. #define QAQ "%I64d"
  11. #else
  12. #define QAQ "%lld"
  13. #endif
  14.  
  15. struct ed
  16. {
  17. int v, w; ed * nx; ed() {}
  18. ed(int _v, int _w, ed * _nx)
  19. : v(_v), w(_w), nx(_nx) {}
  20.  
  21. } *G[maxn], mem[maxn << 2], *all = mem;
  22.  
  23. int n, m, vis[maxn << 2];
  24. struct dij
  25. {
  26. i64 dis; int o;
  27. inline bool operator<(const dij& other)
  28. const { return dis > other.dis; }
  29. }; priority_queue<dij> Q;
  30. i64 dist[maxn];
  31. inline i64 mindist(int s, int fbd)
  32. {
  33. static int vvv[maxn]; int cnt = 0;
  34. Q.push((dij) { dist[s] = 0, s });
  35. while (Q.size())
  36. {
  37. int o = Q.top().o; Q.pop();
  38. if (vis[o]) continue;
  39. vis[vvv[cnt++] = o] = true;
  40. for (ed *p = G[o]; p; p = p->nx) if ((p - mem) >>1 != fbd)
  41. if (!vis[p->v] && mint(dist[p->v], dist[o] + p->w))
  42. Q.push((dij) { dist[p->v], p->v });
  43. }
  44. i64 ret = dist[1];
  45. while (cnt --> 0)
  46. {
  47. dist[vvv[cnt]] = 0x3f3f3f3f3f3f3f3fLL;
  48. vis[vvv[cnt]] = 0;
  49. } return ret;
  50. }
  51. int main()
  52. {
  53. freopen("both.in", "r", stdin);
  54. #ifndef debug
  55. freopen("both.out", "w", stdout);
  56. #endif
  57. scanf("%d%d", &n, &m);
  58. for (int i = 0; i < m; ++i)
  59. {
  60. int u, v, x, y; scanf("%d%d%d%d", &u, &v, &x, &y);
  61. G[u] = new(all++) ed(v, x, G[u]);
  62. G[v] = new(all++) ed(u, y, G[v]);
  63. }
  64. memset(dist, 0x3f, sizeof(dist));
  65. i64 ans = 0x3f3f3f3f3f3f3f3fLL;
  66. for (ed *p = G[1]; p; p = p->nx)
  67. mint(ans, mindist(p->v, (p - mem) >> 1) + p->w);
  68. if (ans == 0x3f3f3f3f3f3f3f3fLL) puts("-1");
  69. else printf(QAQ"\n", ans);
  70.  
  71. }