记录编号 206978 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2015]运输计划 最终得分 100
用户昵称 Gravatar~Love Star 是否通过 通过
代码语言 C++ 运行时间 1.761 s
提交时间 2015-11-10 07:18:43 内存使用 34.64 MiB
显示代码纯文本
  1. #include<set>
  2. #include<queue>
  3. #include<vector>
  4. #include<cstdio>
  5. #include<cstring>
  6. #include<algorithm>
  7. using namespace std;
  8. const int maxn=300005;
  9. int n,m;
  10. set<int> s1;
  11. set<int> s2;
  12. set<int>::iterator It;
  13. vector<int> G[maxn];
  14. struct Edge{
  15. int from,to,cap;
  16. };
  17. struct Heapnode{
  18. int id,len;
  19. };
  20. bool operator <(const Heapnode &a,const Heapnode &b)
  21. {
  22. return a.len<b.len;
  23. }
  24. bool operator >(const Heapnode &a,const Heapnode &b)
  25. {
  26. return a.len>b.len;
  27. }
  28. priority_queue<Heapnode> heap;
  29. struct Query{
  30. int u,v,len,lca;
  31. bool operator < (const Query& rhs) const
  32. {
  33. return len>rhs.len;
  34. }
  35. };
  36. Query Q[maxn];
  37. vector<Edge> edges;
  38. int f[maxn][20],dist[maxn],d[maxn],num[maxn];
  39. int readint()
  40. {
  41. int x=0;
  42. char ch=getchar();
  43. while(ch<'0'||ch>'9') ch=getchar();
  44. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  45. return x;
  46. }
  47. void dfs(int u,int fa,int sum)
  48. {
  49. dist[u]=sum;
  50. d[u]=d[fa]+1;
  51. f[u][0]=fa;
  52. for(int i=1;i<20;i++)
  53. f[u][i]=f[f[u][i-1]][i-1];
  54. for(int i=0;i<G[u].size();i++)
  55. {
  56. if(edges[G[u][i]].to!=fa) dfs(edges[G[u][i]].to,u,sum+edges[G[u][i]].cap);
  57. else num[u]=G[u][i];
  58. }
  59. }
  60. void Lca1(int &u,int &v,int cnt)
  61. {
  62. int su=u,sv=v;
  63. if(d[u]>d[v])
  64. {
  65. u^=v;
  66. v^=u;
  67. u^=v;
  68. }
  69. int dis=d[v]-d[u];
  70. int ret=dist[v]+dist[u];
  71. for(int i=19;i>=0;i--)
  72. {
  73. if((dis>>i)&1) v=f[v][i];
  74. }
  75. for(int i=19;i>=0;i--)
  76. {
  77. if(f[u][i]!=f[v][i])
  78. {
  79. u=f[u][i];
  80. v=f[v][i];
  81. }
  82. }
  83. if(u!=v)
  84. {
  85. u=f[u][0];
  86. v=f[v][0];
  87. }
  88. ret-=2*dist[u];
  89. Q[cnt].u=su;
  90. Q[cnt].v=sv;
  91. Q[cnt].len=ret;
  92. Q[cnt].lca=u;
  93. }
  94. void Add_Edge1(int u,int k)
  95. {
  96. if(u==Q[k].lca) return;
  97. s1.insert(num[u]);
  98. heap.push((Heapnode){num[u],edges[num[u]].cap});
  99. Add_Edge1(edges[num[u]].to,k);
  100. }
  101. void Add_Edge(int u,int k)
  102. {
  103. if(u==Q[k].lca) return;
  104. s2.insert(num[u]);
  105. Add_Edge(edges[num[u]].to,k);
  106. }
  107. int main()
  108. {
  109. freopen("transport.in","r",stdin);
  110. freopen("transport.out","w",stdout);
  111. n=readint();m=readint();
  112. int from,to,cap;
  113. for(int i=1;i<n;i++)
  114. {
  115. from=readint();to=readint();cap=readint();
  116. edges.push_back((Edge){from,to,cap});
  117. edges.push_back((Edge){to,from,cap});
  118. G[from].push_back(edges.size()-2);
  119. G[to].push_back(edges.size()-1);
  120. }
  121. dfs(1,0,0);
  122. int u,v,len;
  123. for(int i=0;i<m;i++)
  124. {
  125. u=readint();v=readint();
  126. Lca1(u,v,i);
  127. }
  128. sort(Q,Q+m);
  129. int ans=0;
  130. s1.clear();
  131. s2.clear();
  132. Add_Edge1(Q[0].u,0);
  133. Add_Edge1(Q[0].v,0);
  134. ans=Q[0].len-(heap.top()).len;
  135. for(int i=1;i<m;i++)
  136. {
  137. if(ans>=Q[i].len) break;
  138. ans=Q[i].len;
  139. Add_Edge(Q[i].u,i);
  140. Add_Edge(Q[i].v,i);
  141. It=s1.begin();
  142. for(It;It!=s1.end();)
  143. {
  144. int cnt=(*It);
  145. It++;
  146. if(!s2.count(cnt))
  147. {
  148. s1.erase(cnt);
  149. }
  150. }
  151. s2.clear();
  152. if(s1.empty()) break;
  153. while(!s1.count(heap.top().id))
  154. {
  155. heap.pop();
  156. }
  157. if(Q[0].len-(heap.top()).len>=ans) break;
  158. ans=Q[0].len-(heap.top()).len;
  159. }
  160. printf("%d",ans);
  161. return 0;
  162. }