HDU-2568How far away

来源:互联网 发布:java new string 编辑:程序博客网 时间:2024/06/03 15:11
#include <iostream>#include <vector>#include <cstdio>#include <cstring>using namespace std;const int maxn = 40000+ 10;vector<int> mp[maxn],dist[maxn],u[maxn],f[maxn];bool vis[maxn],vt[maxn];int fa[maxn],w[maxn];int ans[maxn];int n;int find(int x){    if(!fa[x])        return x;    return fa[x] = find(fa[x]);}void merge(int x,int y){    int f1 = find(x);    int f2 = find(y);    if(f1 != f2)        fa[f2] = f1;}void Tarjan(int x,int k){    ans[x] = k;    for(int i = 0; i<(int)mp[x].size(); i++)    {        if(!vt[mp[x][i]])        {            int v = mp[x][i];            vt[v] = true;            Tarjan(v,k+dist[x][i]);            merge(x,v);        }    }    vis[x] = true;    for(int i = 0; i<(int)u[x].size(); i++)    {        if(vis[u[x][i]])            w[f[x][i]] = ans[x] + ans[u[x][i]] - 2*ans[find(u[x][i])];    }}int main(){    int t;    scanf("%d",&t);    int a,b,c,m;    while(t--)    {        scanf("%d %d",&n,&m);        for(int i = 1; i<=n; i++)            mp[i].clear(),dist[i].clear(),u[i].clear(),f[i].clear();        memset(vis,false,sizeof(vis));        memset(vt,false,sizeof(vt));        memset(fa,0,sizeof(fa));        memset(w,0,sizeof(w));        memset(ans,0,sizeof(ans));        for(int i = 1; i<=n-1; i++)        {            scanf("%d %d %d",&a,&b,&c);            mp[a].push_back(b),dist[a].push_back(c);            mp[b].push_back(a),dist[b].push_back(c);        }        for(int i = 1; i<=m; i++)        {            scanf("%d %d",&a,&b);            u[a].push_back(b),u[b].push_back(a);            f[a].push_back(i),f[b].push_back(i);        }        vt[1] = true;        Tarjan(1,0);        for(int i = 1; i<=m; i++)            printf("%d\n",w[i]);    }    return 0;}