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 ;
}

最新文章

  1. HTML、CSS、JS对unicode字符的不同处理
  2. Java小知识--length,length(),size()方法详细介绍
  3. android base64 和 aes 加密 解密
  4. ✡ leetcode 172. Factorial Trailing Zeroes 阶乘中的结尾0个数--------- java
  5. Open Cascade DataExchange IGES
  6. oracle中Window和Window Group
  7. CF 363B One Bomb(枚举)
  8. MFC listcontrol 分列 添加行数据 点击列头排序
  9. sql中 查询条件出现单引号和特殊字符处理
  10. dissmiss a UISearchBar with an SearchBarController
  11. usb驱动开发9之设备描述符
  12. RHadoop计算平台搭建
  13. 负载均衡server load balancer
  14. build Intent
  15. Android开发性能优化大总结(二)
  16. spring 4 泛型注入
  17. 实现简单的跨站脚本攻击(XSS)
  18. 【2017-05-04】winfrom进程、线程
  19. &quot;二分法&quot;-&quot;折半法&quot;-查找算法-之通俗易懂,图文+代码详解-java编程
  20. Vue-Router路由 Vue-CLI脚手架和模块化开发 之 使用路由对象获取参数

热门文章

  1. VerilogHDL可综合设计的注意事项
  2. pwnable.kr bof之write up
  3. Unity3D 中材质球(Material)预制体打包成AB(AssetBundle)出现材质丢失问题的解决方案
  4. Redis架构设计--客户端请求RedisServer时,server端持久化的部分操作
  5. HDU 6033 Add More Zero (数学)
  6. 【前端,干货】react and redux教程学习实践(二)。
  7. .net 设置webbrowser控件使用的IE版本
  8. C语言程序设计进阶 翁恺 第4周编程练习
  9. 安卓Service完全解析(上)
  10. 错误 0xc0202049: 数据流任务 1: 无法在只读列“ID”中插入数据