比赛 |
20160229 |
评测结果 |
AAAAAAAAAA |
题目名称 |
距离咨询 |
最终得分 |
100 |
用户昵称 |
膜拜神犇张子昂 |
运行时间 |
0.055 s |
代码语言 |
C++ |
内存使用 |
3.03 MiB |
提交时间 |
2016-02-29 20:51:49 |
显示代码纯文本
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
char * ptr=new char[1000000];
typedef short hd;
struct qs{
int succ;
qs * next;
hd i;
}* q[40001],* qtr;
struct gs{
int x,y;
gs * next;
hd i;
}* get[40001],* gtr;
int ans[10001],fa[40001],n[80001],s[80001],p[40001],tot=1,l[80001],dis[40001];
bool flag[40001];
inline void add(int x,int y,int lng){
n[tot]=p[x],p[x]=tot,s[tot]=y,l[tot++]=lng;
}
inline void in(int &x){
while(*ptr<'0'||*ptr>'9')++ptr;
x=0;
while(*ptr>47&&*ptr<58)x=x*10+*ptr++-'0';
}
inline void in(char &x){
while(*ptr<'A'||*ptr>'Z')++ptr;
x=*ptr++;
}
inline int find(int x){
if(fa[x]!=fa[fa[x]]){
int ftr=fa[x];
fa[x]=find(fa[x]);
dis[x]+=dis[ftr];
}
return fa[x];
}
inline void dfs(int x,int ftr,int d){
fa[x]=x,dis[x]=0;
for(int i=p[x];i;i=n[i])
if(s[i]!=ftr)
dfs(s[i],x,l[i]);
flag[x]=1;
for(qs * i=q[x];i;i=i->next)
if(flag[i->succ]){
gtr=new gs((gs){x,i->succ,get[find(i->succ)],i->i});
get[fa[i->succ]]=gtr;
}
for(gs * i=get[x];i;i=i->next){
find(i->x),find(i->y);
ans[i->i]=dis[i->x]+dis[i->y];
}
fa[x]=ftr,dis[x]=d;
}
int main(){
int f1,f2,i,N,M,K,l;
char d;
freopen("dquery.in","r",stdin);freopen("dquery.out","w",stdout);
fread(ptr,1,1000000,stdin);
in(N),in(M);
for(i=0;i<M;++i){
in(f1),in(f2),in(l),in(d);
add(f1,f2,l),add(f2,f1,l);
}
in(K);
for(i=0;i<N;++i)
q[i]=NULL,get[i]=NULL;
for(hd i=0;i<K;++i){
in(f1),in(f2);
qtr=new qs((qs){f2,q[f1],i});
q[f1]=qtr;
qtr=new qs((qs){f1,q[f2],i});
q[f2]=qtr;
}
dfs(1,0,0);
for(i=0;i<K;++i)
printf("%d\n",ans[i]);
}