zoukankan      html  css  js  c++  java
  • HDU 6201 transaction transaction transaction(拆点最长路)

    transaction transaction transaction

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)
    Total Submission(s): 88    Accepted Submission(s): 39

    Problem Description

    Kelukin is a businessman. Every day, he travels around cities to do some business. On August 17th, in memory of a great man, citizens will read a book named "the Man Who Changed China". Of course, Kelukin wouldn't miss this chance to make money, but he doesn't have this book. So he has to choose two city to buy and sell.
    As we know, the price of this book was different in each city. It is ai yuan in it city. Kelukin will take taxi, whose price is 1yuan per km and this fare cannot be ignored.
    There are n−1 roads connecting n cities. Kelukin can choose any city to start his travel. He want to know the maximum money he can get.


     
    Input

    The first line contains an integer T (1≤T≤10) , the number of test cases.
    For each test case:
    first line contains an integer n (2≤n≤100000) means the number of cities;
    second line contains n numbers, the ith number means the prices in ith city; (1≤Price≤10000)
    then follows n−1 lines, each contains three numbers x, y and z which means there exists a road between x and y, the distance is zkm (1≤z≤1000).


    (1z1000)
     
    Output
    For each test case, output a single number in a line: the maximum money he can get.
     
    Sample Input
    1
    4
    10 40 15 30
    1 2 30
    1 3 2
    3 4 10
     
    Sample Output
    8
     

    题目链接:HDU 6201

    这题感觉还是蛮有意思的,由于以前被拆点的题目坑过,看到这题就是求未知起点的最长路,但是它有边权,也有点权啊怎么办,可以把点拆成入点和出点,然后构造源点S和终点T,然后这样连边(由于我用最长路求,显然记买入和路费为负,卖出为正):

    $<i,i+n,0>$,自身拆点肯定要连;

    $<u+n,v,-dis>$、$<v+n,u,-dis>$,由于要求价值最大,花费显然要负权;

    $<S,i,-price[i]>$,由于未知起点,那么直接把点都连到S上从S开始,并且这样刚好可以把点权转换成边权

    $<i+n,T,price[i]>$,卖掉第i个后到T点。

    然后这样写了之后感觉没什么问题就交了,反正是1A了。

    代码:

    #include <stdio.h>
    #include <iostream>
    #include <algorithm>
    #include <cstdlib>
    #include <cstring>
    #include <bitset>
    #include <string>
    #include <stack>
    #include <cmath>
    #include <queue>
    #include <set>
    #include <map>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define LC(x) (x<<1)
    #define RC(x) ((x<<1)+1)
    #define MID(x,y) ((x+y)>>1)
    #define fin(name) freopen(name,"r",stdin)
    #define fout(name) freopen(name,"w",stdout)
    #define CLR(arr,val) memset(arr,val,sizeof(arr))
    #define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
    typedef pair<int, int> pii;
    typedef long long LL;
    const double PI = acos(-1.0);
    const int N = 100010;
    struct edge
    {
        int to, nxt, d;
        edge() {}
        edge(int _to, int _nxt, int _d): to(_to), nxt(_nxt), d(_d) {}
    } E[N * 5];
    int head[N << 1], tot;
    bitset < N << 1 > vis;
    int d[N << 1];
    int price[N];
    
    void init()
    {
        CLR(head, -1);
        tot = 0;
    }
    inline void add(int s, int t, int d)
    {
        E[tot] = edge(t, head[s], d);
        head[s] = tot++;
    }
    void spfa(int s)
    {
        CLR(d, -INF);
        vis.reset();
        vis[s] = 1;
        d[s] = 0;
        queue<int>Q;
        Q.push(s);
        while (!Q.empty())
        {
            int u = Q.front();
            Q.pop();
            vis[u] = 0;
            for (int i = head[u]; ~i; i = E[i].nxt)
            {
                int v = E[i].to;
                if (d[v] < d[u] + E[i].d)
                {
                    d[v] = d[u] + E[i].d;
                    if (!vis[v])
                    {
                        vis[v] = 1;
                        Q.push(v);
                    }
                }
            }
        }
    }
    int main(void)
    {
        int T, n, a, b, dx, i;
        scanf("%d", &T);
        while (T--)
        {
            init();
            scanf("%d", &n);
            int S = 0, T = 2 * n + 1;
            for (i = 1; i <= n; ++i)
            {
                scanf("%d", &price[i]);
                add(i, i + n, 0);
                add(S, i, -price[i]);
                add(i + n, T, price[i]);
            }
            for (i = 1; i < n; ++i)
            {
                scanf("%d%d%d", &a, &b, &dx);
                add(a + n, b, -dx);
                add(b + n, a, -dx);
            }
            spfa(S);
            printf("%d
    ", d[T]);
        }
        return 0;
    }
  • 相关阅读:
    python和搜索
    Flask---ajax(jquery)交互
    Flask--修改默认的static文件夹的方法
    Flask设计带认证token的RESTful API接口[翻译]
    Python 和 Flask实现RESTful services
    等差数列偶数被除2删除后的恢复问题(2018小马智行秋招计算机视觉第三道编程题)
    Leetcode 140 单词拆分II: 字符串s在字典wordDict中有多少种拆分方法。
    LeetCode 139 单词拆分:字符串s能否分割为字符串数组words(wordDict)中字符串的组合?(某未来公司面试题目)
    ROS时间概念总结:ros::Time、ros::Duration、定时器ros::Timer&ros::Rate
    ++i、i++、i+=1、i=i+1的区别
  • 原文地址:https://www.cnblogs.com/Blackops/p/7501966.html
Copyright © 2011-2022 走看看