比赛 东方版NOIP模拟赛 评测结果 AAAAAAAAAAAAAAEAAAET
题目名称 Yuyuko 最终得分 85
用户昵称 Skyo 运行时间 7.824 s
代码语言 C++ 内存使用 2.09 MiB
提交时间 2015-10-28 19:52:53
显示代码纯文本
  1. #include <cstdio>
  2. #include <queue>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. int n, m, ans = 1<<30, h[30005], v[100005], nx[100005], w[100005], ot[100005], d[30005];
  8. bool inq[30005];
  9. queue <int> q;
  10.  
  11. void Initialize()
  12. {
  13. freopen("zaw.in", "r", stdin);
  14. freopen("zaw.out", "w", stdout);
  15. scanf("%d %d", &n, &m);
  16. for(int i = 1; i <= m; i++)
  17. {
  18. int ui, vi, ai, bi; scanf("%d %d %d %d", &ui, &vi, &ai, &bi);
  19. int e1 = i*2-1, e2 = i*2;
  20. nx[e1] = h[ui], h[ui] = e1, v[e1] = vi, w[e1] = ai;
  21. nx[e2] = h[vi], h[vi] = e2, v[e2] = ui, w[e2] = bi;
  22. ot[e1] = e2, ot[e2] = e1;
  23. }
  24. }
  25.  
  26. int Spfa(int beg, int no)
  27. {
  28. memset(d, 0x3f, sizeof d);
  29. memset(inq, 0, sizeof inq);
  30. while(!q.empty()) q.pop();
  31. d[beg] = 0;
  32. q.push(beg);
  33. while(!q.empty())
  34. {
  35. int u = q.front(); q.pop(); inq[u] = 0;
  36. for(int i = h[u]; i; i = nx[i])
  37. if(i != no && d[v[i]] > d[u] + w[i])
  38. {
  39. d[v[i]] = d[u] + w[i];
  40. if(!inq[v[i]]) {inq[v[i]] = 1; q.push(v[i]);}
  41. }
  42. }
  43. return d[1];
  44. }
  45.  
  46. int main()
  47. {
  48. Initialize();
  49. for(int i = h[1]; i; i = nx[i])
  50. ans = min(ans, Spfa(v[i], ot[i])+w[i]);
  51. printf("%d", ans < (int)2e7 ? ans : -1);
  52. return 0;
  53. }