记录编号 |
206978 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOIP 2015]运输计划 |
最终得分 |
100 |
用户昵称 |
~Love Star |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.761 s |
提交时间 |
2015-11-10 07:18:43 |
内存使用 |
34.64 MiB |
显示代码纯文本
#include<set>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=300005;
int n,m;
set<int> s1;
set<int> s2;
set<int>::iterator It;
vector<int> G[maxn];
struct Edge{
int from,to,cap;
};
struct Heapnode{
int id,len;
};
bool operator <(const Heapnode &a,const Heapnode &b)
{
return a.len<b.len;
}
bool operator >(const Heapnode &a,const Heapnode &b)
{
return a.len>b.len;
}
priority_queue<Heapnode> heap;
struct Query{
int u,v,len,lca;
bool operator < (const Query& rhs) const
{
return len>rhs.len;
}
};
Query Q[maxn];
vector<Edge> edges;
int f[maxn][20],dist[maxn],d[maxn],num[maxn];
int readint()
{
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x;
}
void dfs(int u,int fa,int sum)
{
dist[u]=sum;
d[u]=d[fa]+1;
f[u][0]=fa;
for(int i=1;i<20;i++)
f[u][i]=f[f[u][i-1]][i-1];
for(int i=0;i<G[u].size();i++)
{
if(edges[G[u][i]].to!=fa) dfs(edges[G[u][i]].to,u,sum+edges[G[u][i]].cap);
else num[u]=G[u][i];
}
}
void Lca1(int &u,int &v,int cnt)
{
int su=u,sv=v;
if(d[u]>d[v])
{
u^=v;
v^=u;
u^=v;
}
int dis=d[v]-d[u];
int ret=dist[v]+dist[u];
for(int i=19;i>=0;i--)
{
if((dis>>i)&1) v=f[v][i];
}
for(int i=19;i>=0;i--)
{
if(f[u][i]!=f[v][i])
{
u=f[u][i];
v=f[v][i];
}
}
if(u!=v)
{
u=f[u][0];
v=f[v][0];
}
ret-=2*dist[u];
Q[cnt].u=su;
Q[cnt].v=sv;
Q[cnt].len=ret;
Q[cnt].lca=u;
}
void Add_Edge1(int u,int k)
{
if(u==Q[k].lca) return;
s1.insert(num[u]);
heap.push((Heapnode){num[u],edges[num[u]].cap});
Add_Edge1(edges[num[u]].to,k);
}
void Add_Edge(int u,int k)
{
if(u==Q[k].lca) return;
s2.insert(num[u]);
Add_Edge(edges[num[u]].to,k);
}
int main()
{
freopen("transport.in","r",stdin);
freopen("transport.out","w",stdout);
n=readint();m=readint();
int from,to,cap;
for(int i=1;i<n;i++)
{
from=readint();to=readint();cap=readint();
edges.push_back((Edge){from,to,cap});
edges.push_back((Edge){to,from,cap});
G[from].push_back(edges.size()-2);
G[to].push_back(edges.size()-1);
}
dfs(1,0,0);
int u,v,len;
for(int i=0;i<m;i++)
{
u=readint();v=readint();
Lca1(u,v,i);
}
sort(Q,Q+m);
int ans=0;
s1.clear();
s2.clear();
Add_Edge1(Q[0].u,0);
Add_Edge1(Q[0].v,0);
ans=Q[0].len-(heap.top()).len;
for(int i=1;i<m;i++)
{
if(ans>=Q[i].len) break;
ans=Q[i].len;
Add_Edge(Q[i].u,i);
Add_Edge(Q[i].v,i);
It=s1.begin();
for(It;It!=s1.end();)
{
int cnt=(*It);
It++;
if(!s2.count(cnt))
{
s1.erase(cnt);
}
}
s2.clear();
if(s1.empty()) break;
while(!s1.count(heap.top().id))
{
heap.pop();
}
if(Q[0].len-(heap.top()).len>=ans) break;
ans=Q[0].len-(heap.top()).len;
}
printf("%d",ans);
return 0;
}