HDU

来源:互联网 发布:python中的不可变类型 编辑:程序博客网 时间:2024/06/08 10:07

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6201

题目大意:选2个城市,一个买书,一个卖书,只买一本,问最多赚多少钱

解题思路:直接跑一遍Dfs,思路写在代码里(最终解一定是一个书价小的点经过若干条边到达一个书价大的点)

AC代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int Inf = 0x3f3f3f3f;const int MAXN = 100000+5;struct Edge{    int _v, _val, _next;    Edge(int v = 0, int val = 0, int next = 0) :_v(v), _val(val), _next(next) {}}edge[MAXN<<1];int gt[MAXN], head[MAXN], edgnum;LL ans;void toInit(){    edgnum = 0;    memset(head, -1, sizeof(head));    ans = 0;}void toAdd(int u, int v, int val){    edge[edgnum] = Edge(v, val, head[u]);    head[u] = edgnum++;}void Dfs(int fa,int u,LL val,int flag)//flag=0表示fa到u的书价格增大,=1表示书价格减小,val记录之前赚的钱{    ans = max(val, ans);    for (int i = head[u];i != -1;i = edge[i]._next)    {        int v = edge[i]._v;        if (v == fa) continue;        if (gt[v] > gt[u])        {            int tmp = gt[v] - gt[u] - edge[i]._val;            if (tmp < 0)//如果这两个点买书卖书亏的话,那么舍弃这两个点                Dfs(u, v, 0, 0);            else            {                if (flag == 1)                    Dfs(u, v, tmp, 0);//如果跟之前的flag相反的话,那么舍弃之前的,以这两个点重新开始记录                else                    Dfs(u, v, val + tmp, 0);//如果flag相同,那么可以叠加            }        }        else//同理        {            int tmp = gt[u] - gt[v] - edge[i]._val;            if (tmp < 0)                Dfs(u, v, 0, 0);            else            {                if (flag == 0)                    Dfs(u, v, tmp, 1);                else                    Dfs(u, v, val + tmp, 1);            }        }    }}int main(){    int t;scanf("%d", &t);    while (t--)    {        toInit();        int n;scanf("%d", &n);        int rt,minn=Inf;        for (int i = 1;i <= n;++i)        {            scanf("%d", gt + i);            if (gt[i] < minn)                rt = i, minn = gt[i];        }        for (int i = 1;i <= n - 1;++i)        {            int u, v, val;            scanf("%d%d%d", &u, &v, &val);            toAdd(u, v, val);            toAdd(v, u, val);        }        Dfs(rt, rt, 0, 0);        printf("%I64d\n", ans);    }    return 0;}
原创粉丝点击