hdu2586

来源:互联网 发布:php教务管理系统源码 编辑:程序博客网 时间:2024/06/06 00:48
# include <iostream># include <cstdio># include <cstring># include <string># include <cmath># include <vector># include <map># include <queue># include <cstdlib># define MAXN 40001using namespace std;int n, mm, s;int fa[MAXN], qx[MAXN], qy[MAXN], ans[MAXN], f[MAXN];vector <int> vec[MAXN], q[MAXN];struct node{    int x,y;    node(int a,int b)    {        x=a,y=b;    }    bool operator <(const node &no)const    {        if(y!=no.y) return y<no.y;        if(y==no.y)            return (x<no.x );    }};map<node,int> m;inline int find(int x){    return x == fa[x] ? x : find(fa[x]);}inline void dfs(int u){    int i, v;    fa[u] = u;    for(i = 0; i < vec[u].size(); i++)    {        v = vec[u][i];        if(f[u] != v) f[v] = u, dfs(v);    }    for(i = 0; i < q[u].size(); i++)        if(f[v = u ^ qx[q[u][i]] ^ qy[q[u][i]]])//^运算获得与u相连的点(qx,qy中必有一个是u)        {            ans[q[u][i]] = find(v);        }    fa[u] = f[u];//这里f相当于vis数组}void solve(){    for(int i=1;i<=mm;i++)    {        int u=qx[i];        int v=qy[i];        int tmp=ans[i];        int sum=0;        while(v!=tmp)        {            sum+=m[node(v,fa[v])];            v=fa[v];        }        while(u!=tmp)        {            sum+=m[node(u,fa[u])];            u=fa[u];        }        ans[i]=sum;    }}int main(){    int i, x, y,z;    int t;    cin>>t;    while(t--)    {        cin>>n>>mm;        for(i = 1; i < n; i++)        {            cin>>x>>y>>z;            m[node(x,y)]=z;            m[node(y,x)]=z;            vec[x].push_back(y);            vec[y].push_back(x);        }        for(i = 1; i <= mm; i++)        {            cin>>qx[i]>>qy[i];            q[qx[i]].push_back(i);            q[qy[i]].push_back(i);        }        dfs(1);        solve();        for(i = 1; i <= mm; i++) printf("%d\n", ans[i]);    }    return 0;}/*23 21 2 103 1 152 31 2*/
原创粉丝点击