比赛 4043级NOIP2022欢乐赛6th 评测结果 AAAAATTAAA
题目名称 旅行者 最终得分 80
用户昵称 yrtiop 运行时间 13.650 s
代码语言 C++ 内存使用 9.82 MiB
提交时间 2022-11-18 19:26:23
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. #define pb emplace_back
  3. using pii = std::pair<long long,int>;
  4. using i64 = long long;
  5.  
  6. const int maxn = 1e5 + 5;
  7. const int maxm = 5e5 + 5;
  8. std::vector<std::pair<int,int> > G[maxn];
  9. int n,m,k,a[maxn];
  10. std::priority_queue<pii,std::vector<pii>,std::greater<pii> > q;
  11. bool vis[maxn];
  12. i64 dis[maxn];
  13.  
  14. void dijkstra(int s) {
  15. memset(vis , false , sizeof(vis));
  16. for(int i = 0;i <= n + 1;++ i)
  17. dis[i] = 1e16;
  18. q.emplace(dis[s] = 0 , s);
  19. while(!q.empty()) {
  20. int u = q.top().second;
  21. q.pop();
  22. if(vis[u])continue ;
  23. vis[u] = true;
  24. for(auto& [v , w] : G[u]) {
  25. if(dis[v] > dis[u] + w) {
  26. q.emplace(dis[v] = dis[u] + w , v);
  27. }
  28. }
  29. }
  30. return ;
  31. }
  32.  
  33. void work() {
  34. scanf("%d %d %d",&n,&m,&k);
  35. for(int i = 0;i <= n + 1;++ i)
  36. G[i].clear();
  37. for(int i = 1;i <= m;++ i) {
  38. int u,v,t;
  39. scanf("%d %d %d",&u,&v,&t);
  40. G[u].pb(v , t);
  41. }
  42. for(int i = 1;i <= k;++ i)
  43. scanf("%d",&a[i]);
  44. i64 ans = 1e16;
  45. int s = 0,t = n + 1;
  46. for(int p = 17;~ p;-- p) {
  47. G[s].clear();
  48. G[t].clear();
  49. for(int i = 1;i <= k;++ i)
  50. if((~ a[i]) >> p & 1)G[s].pb(a[i] , 0);
  51. else G[t].pb(a[i] , 0);
  52. dijkstra(s);
  53. for(int i = 1;i <= k;++ i)
  54. if(a[i] >> p & 1)ans = std::min(ans , dis[a[i]]);
  55. dijkstra(t);
  56. for(int i = 1;i <= k;++ i)
  57. if((~ a[i]) >> p & 1)ans = std::min(ans , dis[a[i]]);
  58. }
  59. printf("%lld\n",ans);
  60. return ;
  61. }
  62.  
  63. int main() {
  64. freopen("WAW.in","r",stdin);
  65. freopen("WAW.out","w",stdout);
  66. int T;
  67. scanf("%d",&T);
  68. while(T --)work();
  69. return 0;
  70. }