比赛 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]);
}