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
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.
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).
(1≤z≤1000).
题目链接: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\n", d[T]);
}
return 0;
}
HDU 6201 transaction transaction transaction(拆点最长路)的更多相关文章
- HDU 4514并查集判环+最长路
点击打开链接 题意:中文题...... 思路:先推断是否能成环,之前以为是有向图,就用了spfa推断,果断过不了自己出的例子,发现是无向图.并查集把,两个点有公共的父节点,那就是成环了,之后便是求最长 ...
- HDU 6201 2017沈阳网络赛 树形DP或者SPFA最长路
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6201 题意:给出一棵树,每个点有一个权值,代表商品的售价,树上每一条边上也有一个权值,代表从这条边经过 ...
- hdu 1534(差分约束+spfa求最长路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1534 思路:设s[i]表示工作i的开始时间,v[i]表示需要工作的时间,则完成时间为s[i]+v[i] ...
- HDU 6201 transaction transaction transaction(树形DP)
transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 132768/1 ...
- HDU - 6201 transaction transaction transaction(树形dp取两点)
transaction transaction transaction Kelukin is a businessman. Every day, he travels around cities to ...
- 2017ICPC沈阳网络赛 HDU 6201 -- transaction transaction transaction(树上dp)
transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 132768/1 ...
- hdu 6201 transaction transaction transaction
https://vjudge.net/contest/184514#problem/H 题意: 一个商人为了赚钱,在城市之间倒卖商品.有n个城市,每个城市之间有且只有一条无向边连通.给出n个城市的货物 ...
- HDU 6201 transaction transaction transaction (树形DP)
题意:给定一棵树,每个点有一个点权,每条边也是,找一条路径,问你 T-S-sum,T表示路径的终点的权值,S表示路径始点的权值,sum表示从S到T的边权和. 析:把这一条路径拆开来看,那么就是必然是从 ...
- HDU - 6201:transaction transaction transaction(最长路)
Kelukin is a businessman. Every day, he travels around cities to do some business. On August 17th, i ...
随机推荐
- 让图片在div盒子中水平垂直居中
//调整多张图片,让图片水平垂直居中 function adjustImg(){ let imgDiv = document.getElementsByClassName("img" ...
- JQuery中使用FormData异步提交数据和提交文件
web中数据提交事件是常常发生的,但是大多数情况下我们不希望使用html中的form表单提交,因为form表单提交会中断当前浏览器的操作并且会调到另一个地址(即使这个地址是当前页面),并且会重复加载一 ...
- 记6种php 加密解密方法
<?php function encryptDecrypt($key, $string, $decrypt){ if($decrypt){ $decrypted = rtrim(mcrypt_d ...
- 为何企业钟爱H5响应式网站? html5响应式网站的优势与特点
随着移动互联网时代的到来,H5响应式网站应运而生,并成功获得了商家.访客.搜索引擎等的青睐!越来越多的企业也选择了H5响应式建站,可为何企业钟爱H5响应式网站呢?难道传统网站不好吗?这个不能妄下结论, ...
- oracle监听配置
在listener.ora文件中指定监听的实例名和修改ip地址: 查看实例名:[localhost$] echo $ORACLE_SID LISTENER = (DESCRIPTION_LIST = ...
- python2.7入门---Number(数字)
今天咱们来简单分享一下关于python中的一种数据类型和操作方法.费话不多说哈,咱们直接来进行实践加理论.首先,我们要知道,Python Number 数据类型用于存储数.数据类型是不允许改变 ...
- 怎样安装Python3
在浏览器地址栏输入https://www.python.org/ 打开Python官网 好了,安装完成了! 可以把安装路径C:\Users\Administrator\AppData\Local\Pr ...
- JVM 什么时候会触发FGC
1:System.gc(); 2:老年代满了 没啥好说的从年轻代去往老年代的 3:JDK7或JDK6中永久区满了 得看是否还会有分配,如果没有就不会进行FGC,不过CMS GC下会看到不停地CMS G ...
- Word2Vec词向量(一)
一.词向量基础(一)来源背景 word2vec是google在2013年推出的一个NLP工具,它的特点是将所有的词向量化,这样词与词之间就可以定量的去度量他们之间的关系,挖掘词之间的联系.虽然源码是 ...
- MySQL训练营01
一.数据库基础知识: 1. 数据库(database):保存有组织的数据的容器(通常是一个或者一组文件) 2. 数据库管理系统(DBMS):数据库软件,外界通过DBMS来创建和操纵数据库,具体是什么, ...