记录编号 |
471668 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[USACO Feb04]距离咨询 |
最终得分 |
100 |
用户昵称 |
coolkid |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.104 s |
提交时间 |
2017-11-06 18:29:44 |
内存使用 |
7.95 MiB |
显示代码纯文本
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int MAXN=40010;
const int MAXLOG=20;
struct Edge{
int from,to,dist,nxt;
}edges[MAXN<<1];
int head[MAXN],p=0;
void addedge(int f,int t,int d){
edges[p].from=f;edges[p].to=t;edges[p].dist=d;edges[p].nxt=head[f];head[f]=p;p++;
}
int n,m,q;
int dep[MAXN],fa[MAXN][MAXLOG],faw[MAXN][MAXLOG];
void init(){
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int f,t,d;char s[5];
scanf("%d%d%d%s",&f,&t,&d,s);
addedge(f,t,d);
addedge(t,f,d);
}
}
void dfs(int u){
for(int i=head[u];~i;i=edges[i].nxt){
int v=edges[i].to,d=edges[i].dist;
if(fa[u][0]==v) continue;
fa[v][0]=u;faw[v][0]=d;dep[v]=dep[u]+1;
dfs(v);
}
}
int mxlg=0;
void Mk(){
for(int i=MAXLOG;i>=0;i--) if(n&(1<<i)){ mxlg=i;break; }
mxlg++;
for(int j=1;j<=mxlg;j++)
for(int i=1;i<=n;i++) fa[i][j]=fa[fa[i][j-1]][j-1],faw[i][j]=faw[fa[i][j-1]][j-1]+faw[i][j-1];
}
void Query(int u,int v){
if(dep[v]>dep[u]) swap(u,v);
int dlt=dep[u]-dep[v];
int res=0;
for(int i=mxlg;i>=0;i--) if(dlt&(1<<i)) res+=faw[u][i],u=fa[u][i];
for(int i=mxlg;i>=0;i--){
if(fa[u][i]!=fa[v][i]){
res+=(faw[u][i]+faw[v][i]);
u=fa[u][i];v=fa[v][i];
}
}
if(u==v){
printf("%d\n",res);
return;
}
printf("%d\n",faw[v][0]+faw[u][0]+res);
}
int main(){
freopen("dquery.in","r",stdin);
freopen("dquery.out","w",stdout);
init();
dfs(1);
Mk();
scanf("%d",&q);
for(int i=1;i<=q;i++){
int u,v;
scanf("%d%d",&u,&v);
Query(u,v);
}
return 0;
}