记录编号 310189 评测结果 AAAAAAAAAA
题目名称 距离 最终得分 100
用户昵称 GravatarAAAAAAAAAA 是否通过 通过
代码语言 C++ 运行时间 4.070 s
提交时间 2016-09-21 19:31:03 内存使用 687.44 MiB
显示代码纯文本
#include<fstream>
#include<vector>
using namespace std;
int f[10001],ances[10001],vis[10001],lca[10001][10001],dist[10001],v[10001][10001]={0};
vector<int>a[10001];
vector<int>q[10001];
/*inline int GetInt(FILE *fin)
{
	int num = 0,flag = 0;
	char ch;
	ch = fgetc(fin);
	while(' ' == ch || '\n' == ch)
		ch = fgetc(fin);
	if ('-' == ch)
	{
		flag = 1;
		ch = fgetc(fin);
	}
	while('0' <= ch && ch <= '9')
	{
		num = (num << 3) + (num << 1) + ch - '0';
		ch = fgetc(fin);
	}
	if (flag)
		return -num;
	else
		return num;
}*/
void memset(int n){
    for(int i=1;i<=n;i++){
        f[i]=i;
        ances[i]=i;
        vis[i]=0;
        dist[i]=0;
        v[i][i]=0;
    }}
int findf(int x){
    if(f[x]!=x){
        f[x]=findf(f[x]);}
    return f[x];}
void merge(int x,int y){
    int xx=findf(x);
    int yy=findf(y);
    if(xx!=yy){
        f[xx]=yy;}}
void tarjan(int u){
    vis[u]=1;
    f[u]=u;
    ances[u]=u;
    int temp=a[u].size();
    for(int i=0;i<temp;i++){
        if(vis[a[u][i]]==0){
			dist[a[u][i]]=dist[u]+v[u][a[u][i]];
        tarjan(a[u][i]);
        merge(a[u][i],u);
		ances[findf(u)]=u;
		}}
    temp=q[u].size();
    for(int i=0;i<temp;i++){
        if(vis[q[u][i]]==1){
            lca[u][q[u][i]]=ances[findf(q[u][i])];
            lca[q[u][i]][u]=ances[findf(q[u][i])];
        }}}
int main(){
    ifstream fin("distance.in");
    ofstream fout("distance.out");
    int n,m,x[20001]={0},y[20001]={0},i,j,s,t;
    fin>>n>>m;
	memset(n);
    for(i=0;i<n-1;i++){
        fin>>j>>s>>t;
        a[j].push_back(s);
        a[s].push_back(j);
        v[j][s]=t;
        v[s][j]=t;}
    for(i=0;i<m;i++){
		fin>>x[i]>>y[i];
        q[x[i]].push_back(y[i]);
        q[y[i]].push_back(x[i]);
    }
    tarjan(1);
    for(i=0;i<m;i++){
        fout<<dist[x[i]]+dist[y[i]]-(dist[lca[x[i]][y[i]]]*2)<<endl;}
    return 0;
}