https://vjudge.net/contest/184514#problem/H

题意:

一个商人为了赚钱,在城市之间倒卖商品。有n个城市,每个城市之间有且只有一条无向边连通。给出n个城市的货物的价格,比如A城市是a元,B城市是b元,那么在A买在B卖,赚的钱就是b - a,反之就是 a - b。商人走每条路也需要一定的花费。现在他需要选择某两个城市进行货物的倒卖,问他能获得的最大利润是多少。

思路:

建图的方式非常妙。我们把从A到B的边的权值定义为b - a - v(v为边的权值),从B到A的边的权值定义为a - b - v。依据这个从A到B再到C,就是b - a - v1 加上 c - b - v2,加起来就是c - a - v1 - v2,这样我们就可表示从任意城市到任意城市的距离了。

现在我们要求的就是任意两个城市之间的最大距离。树上最长路并不擅长,所以考虑用最短路求法进行求解。加一个超级源点和超级汇点,跑一遍最短路,就可以了,但是我们求的是最长路。。所以把边取反求最短路就ok了,开始用dijstra跑崩了,忘记了dij不能处理有负权边的图,所以跑了一遍spfa就过了。

这题的主要收获是建图,关键是抵消中间城市对结果的影响。

代码:

 #include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
using namespace std; const int inf = 0x3f3f3f3f; struct edge
{
int from,to;
int cost;
}; vector<edge> edges;
vector<int> v[];
int nodev[];
int dis[];
bool vis[]; void adde(int from,int to,int cost)
{
edge tmp; tmp.from = from;
tmp.to = to;
tmp.cost = -cost; edges.push_back(tmp); int sz = edges.size(); v[from].push_back(sz-);
} void init(int n)
{
for (int i = ;i <= n;i++) v[i].clear(); edges.clear();
} void spfa(void)
{
memset(vis,,sizeof(vis)); memset(dis,inf,sizeof(dis)); queue<int> q; q.push(); dis[] = ; vis[] = ; while (!q.empty())
{
int u = q.front(); q.pop(); vis[u] = ; for (int i = ;i < v[u].size();i++)
{
int id = v[u][i]; int to = edges[id].to; if (dis[to] > dis[u] + edges[id].cost)
{
dis[to] = dis[u] + edges[id].cost; if (!vis[to])
{
q.push(to);
vis[to] = ;
}
}
} }
} int main()
{
int t; scanf("%d",&t); while (t--)
{
int n; scanf("%d",&n); init(n+); for (int i = ;i <= n;i++)
{
scanf("%d",&nodev[i]);
} for (int i = ;i <= n - ;i++)
{
int x,y,z; scanf("%d%d%d",&x,&y,&z); adde(x,y,nodev[y] - nodev[x] - z);
adde(y,x,nodev[x] - nodev[y] - z);
} for (int i = ;i <= n;i++)
{
adde(,i,);
adde(i,n+,);
} spfa(); printf("%d\n",-dis[n+]); //for (int i = 0;i <= n + 1;i++) printf("%d\n",dis[i]);
} return ;
}

hdu 6201 transaction transaction transaction的更多相关文章

  1. HDU 6201 transaction transaction transaction(拆点最长路)

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...

  2. HDU 6201 transaction transaction transaction(树形DP)

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...

  3. HDU - 6201 transaction transaction transaction(树形dp取两点)

    transaction transaction transaction Kelukin is a businessman. Every day, he travels around cities to ...

  4. 2017ICPC沈阳网络赛 HDU 6201 -- transaction transaction transaction(树上dp)

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...

  5. HDU 6201 transaction transaction transaction (树形DP)

    题意:给定一棵树,每个点有一个点权,每条边也是,找一条路径,问你 T-S-sum,T表示路径的终点的权值,S表示路径始点的权值,sum表示从S到T的边权和. 析:把这一条路径拆开来看,那么就是必然是从 ...

  6. HDU - 6201:transaction transaction transaction(最长路)

    Kelukin is a businessman. Every day, he travels around cities to do some business. On August 17th, i ...

  7. hdu 6201 transaction (最短路变形——带负权最长路)

    题意: 给定n个城市的货物买卖价格, 然后给定n-1条道路,每条路有不同的路费, 求出从某两个城市买卖一次的最大利润. 利润 = 卖价 - (买价 + 路费) 样例数据, 最近是从第一个点买入, 第4 ...

  8. HDU - 6201 transaction transaction transaction(spfa求最长路)

    题意:有n个点,n-1条边的无向图,已知每个点书的售价,以及在边上行走的路费,问任选两个点作为起点和终点,能获得的最大利益是多少. 分析: 1.从某个结点出发,首先需要在该结点a花费price[a]买 ...

  9. Could not commit JPA transaction RollbackException: Transaction marked as rollbackOnly

    项目调试时,报以下错误: org.springframework.transaction.TransactionSystemException: Could not commit JPA transa ...

随机推荐

  1. 一、laya学习笔记 --- layabox环境搭建 HelloWorld(坑:ts版本问题解决方案)

    好吧,使用layabox需要从官网下载些啥呢 一.下载layabox 官网 https://www.layabox.com/ 首页上有两个,一个Engine,一个IDE Engine我下载的TS版本, ...

  2. android中SimpleCursorAdapter _id错误的问题

    作为一个android新手,在绑定数据的时候是这样的 ListView listview=(ListView)this.findViewById(R.id.listView1); XJDal xj=n ...

  3. virgo-tomcat-server最大并发连接数的修改

    首先,我们如果需要修改tomcat 7的最大连接数,我们可以去tomcat官方网站,查看Documentation 进入tomcat的官方网站http://tomcat.apache.org我们点击左 ...

  4. html 自动弹出框

    1.点击div外部隐藏, //*代表tip_box所包含的子元素 $('body').click(function(e) { var target = $(e.target); if(!target. ...

  5. 电话、地址、Email等常用正则表达式

    正则表达式用于字符串处理.表单验证等场合,实用高效.现将一些常用的表达式收集于此,以备不时之需. 匹配中文字符的正则表达式: [\u4e00-\u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达 ...

  6. 一个sfm开源项目

    Structure from Motion 资料总结 https://blog.csdn.net/u014636245/article/details/77527627 github上用opencv实 ...

  7. HDU 1222 - Wolf and Rabbit & HDU 1108 - [最大公约数&最小公倍数]

    水题,只是想借此记一下gcd函数的模板 #include<cstdio> int gcd(int m,int n){return n?gcd(n,m%n):m;} int main() { ...

  8. CodeForces - 812B Sagheer, the Hausmeister 搜索 dp

    题意:给你n行长度为m的01串(n<15,m<100) .每次只能走一步,要将所有的1变为零,问最少的步数,注意从左下角开始,每次要将一层清完才能走到上一层,每次只有在第一列或者最后一列才 ...

  9. pdb学习笔记

    参考资料:https://segmentfault.com/a/1190000006628456 下一行(不进入函数内部):n(ext) 单步(进入函数内部):s(tep) 打印:p 动态添加断点:1 ...

  10. HTML_body标签

    常用符号:空格:&nbsp 大于号:&gt 小于号: &lt 块级标签:H标签(加大加粗),P标签(段落间有间距),DIV(白板) 行内标签:SPAN标签(白板) <!- ...