hdu-6201 transaction transaction transaction

来源:互联网 发布:c语言学徒招聘 编辑:程序博客网 时间:2024/06/16 23:38

题意:有一颗N个节点的树,点到点之间有唯一的路径,路径有边权,节点有点权。问:在这颗书上任选两点,使的(点权2 - 点权1) - 路径距离    的最大值。

思路:由于是一棵树,所以我们只要求出从其他节点到该节点的   点权 + 路径  的最小值,再用这个点权减去最小值 得到答案,再维护一下这个答案最大值即可。

我们可以任选一个节点作为根节点,然后深搜一遍,递归的从叶子到根维护从 叶子 到 当前节点的    点权 + 路径   的最小值。这个步骤完成之后,我们初步得到了每一个根节点的 每一颗子树传递上来的最小值, 然后我们再做一次广搜,然后对于每一个节点,他的最小值不仅仅从下传递上来的,还有从上传递下来的,或者是从其他兄弟子树传递过来的,而广搜之后,我们就可以将传递到根节点的最小值(可能是根节点另外子树的的最小值)再往下传,更新最小值,同时维护一下答案就好了。

#include <stdio.h>#include <iostream>#include <string.h>#include <string.h>#include <algorithm>#include <queue>#define siz 100005#include <vector>#define LL long longusing namespace std;const int MAXN = 1e18;int n;int gp[siz];LL ans;struct node{    int ad;    LL value;};vector<node>vec[siz];void Init(){    for(int i=0; i<siz; i++)    {        vec[i].clear();    }}LL fp[siz],bp[siz];bool vis[siz];void dfs(int now,int fa){    int len = vec[now].size();    //node u;    LL num = gp[now];    fp[now] = num;    //Min = num;    for(int i=0; i<len; i++)    {        int u = vec[now][i].ad;        int w = vec[now][i].value;        if(u == fa) continue;        dfs(u,now);        // cout<<now<<" "<<u<<" "<<num<<" "<<w<<" "<<fp[u]<<endl;        fp[now] = min(w + fp[u],fp[now]);    }}void bfs(){    node u,v;    u.ad = 3;    u.value = gp[3];    //bp[1] = gp[1];    queue<node>que;    while(!que.empty()) que.pop();    que.push(u);    while(!que.empty())    {        u = que.front();        que.pop();        ans=max(ans,gp[u.ad]-fp[u.ad]);        int len = vec[u.ad].size();        vis[u.ad] = true;        // cout<<u.ad<<" "<<len<<endl;        for(int i = 0; i<len; i++)        {            int dx = vec[u.ad][i].ad;            int dy = vec[u.ad][i].value;            if(!vis[dx])            {                fp[dx]=min(fp[dx],dy+fp[u.ad]);                v.ad = dx;                v.value = 0;                que.push(v);            }        }    }}void solve(){    dfs(3,-1);    /*for(int i=1;i<=n;i++){        cout<<fp[i]<<" ";    }    cout<<endl;*/    memset(vis,false,sizeof(vis));    ans = 0;    bfs();    printf("%lld\n",ans);}int main(){    int T;    scanf("%d",&T);    while(T--)    {        Init();        scanf("%d",&n);        for(int i=1; i<=n; i++)        {            scanf("%d",&gp[i]);        }        int x,y,va;        node u;        for(int i=1; i<n; i++)        {            scanf("%d%d%d",&x,&y,&va);            u.ad = y;            u.value = va;            vec[x].push_back(u);            u.ad = x;            vec[y].push_back(u);        }        solve();    }    return 0;}


原创粉丝点击