当前位置: 首页 > news >正文

hdu 6201 transaction transaction transaction

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就过了。

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

代码:

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <vector>
  4 #include <queue>
  5 using namespace std;
  6 
  7 const int inf = 0x3f3f3f3f;
  8 
  9 struct edge
 10 {
 11     int from,to;
 12     int cost;
 13 };
 14 
 15 vector<edge> edges;
 16 vector<int> v[100005];
 17 int nodev[100005];
 18 int dis[100010];
 19 bool vis[100010];
 20 
 21 void adde(int from,int to,int cost)
 22 {
 23     edge tmp;
 24 
 25     tmp.from = from;
 26     tmp.to = to;
 27     tmp.cost = -cost;
 28 
 29     edges.push_back(tmp);
 30 
 31     int sz = edges.size();
 32 
 33     v[from].push_back(sz-1);
 34 }
 35 
 36 void init(int n)
 37 {
 38     for (int i = 0;i <= n;i++) v[i].clear();
 39 
 40     edges.clear();
 41 }
 42 
 43 void spfa(void)
 44 {
 45     memset(vis,0,sizeof(vis));
 46 
 47     memset(dis,inf,sizeof(dis));
 48 
 49     queue<int> q;
 50 
 51     q.push(0);
 52 
 53     dis[0] = 0;
 54 
 55     vis[0] = 1;
 56 
 57     while (!q.empty())
 58     {
 59         int u = q.front();
 60 
 61         q.pop();
 62 
 63         vis[u] = 0;
 64 
 65         for (int i = 0;i < v[u].size();i++)
 66         {
 67             int id = v[u][i];
 68 
 69             int to = edges[id].to;
 70 
 71             if (dis[to] > dis[u] + edges[id].cost)
 72             {
 73                 dis[to] = dis[u] + edges[id].cost;
 74 
 75                 if (!vis[to])
 76                 {
 77                     q.push(to);
 78                     vis[to] = 1;
 79                 }
 80             }
 81         }
 82 
 83     }
 84 }
 85 
 86 int main()
 87 {
 88     int t;
 89 
 90     scanf("%d",&t);
 91 
 92     while (t--)
 93     {
 94         int n;
 95 
 96         scanf("%d",&n);
 97 
 98         init(n+1);
 99 
100         for (int i = 1;i <= n;i++)
101         {
102             scanf("%d",&nodev[i]);
103         }
104 
105         for (int i = 1;i <= n - 1;i++)
106         {
107             int x,y,z;
108 
109             scanf("%d%d%d",&x,&y,&z);
110 
111             adde(x,y,nodev[y] - nodev[x] - z);
112             adde(y,x,nodev[x] - nodev[y] - z);
113         }
114 
115 
116         for (int i = 1;i <= n;i++)
117         {
118             adde(0,i,0);
119             adde(i,n+1,0);
120         }
121 
122         spfa();
123 
124         printf("%d\n",-dis[n+1]);
125 
126 
127         //for (int i = 0;i <= n + 1;i++) printf("%d\n",dis[i]);
128     }
129 
130     return 0;
131 }

 

转载于:https://www.cnblogs.com/kickit/p/7507752.html

相关文章:

  • java的(PO,VO,TO,BO,DAO,POJO)解释
  • Cent OS服务器配置(JDK+Tomcat+MySQL)
  • python库基础练习
  • 可以直接cat 多个fq.gz压缩文件
  • 条件、循环、函数定义 练习
  • 深入学习微框架:Spring Boot
  • 原创:mysql下载 实战 最强最全的无脑白痴版 给小白的爱
  • sql语句执行碰到的问题
  • 数据类型和运算符
  • JSP中文乱码问题
  • shell脚本进阶(二)
  • ServiceLoader的使用
  • PHP的memory_limit引起的问题
  • 详解Oracle DELETE和TRUNCATE 的区别
  • QT 设计师使用样式表添加背景
  • [译]CSS 居中(Center)方法大合集
  • eclipse(luna)创建web工程
  • HTTP那些事
  • Laravel核心解读--Facades
  • SpriteKit 技巧之添加背景图片
  • vue 个人积累(使用工具,组件)
  • Vue小说阅读器(仿追书神器)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 技术胖1-4季视频复习— (看视频笔记)
  • 漂亮刷新控件-iOS
  • 前端面试总结(at, md)
  • 设计模式 开闭原则
  • 再次简单明了总结flex布局,一看就懂...
  • 自制字幕遮挡器
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (12)Hive调优——count distinct去重优化
  • (3)llvm ir转换过程
  • (C++20) consteval立即函数
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)四层和七层负载均衡的区别
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .Family_物联网
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .net framework4与其client profile版本的区别
  • .NET 表达式计算:Expression Evaluator
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • ??eclipse的安装配置问题!??
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [20181219]script使用小技巧.txt
  • [BJDCTF2020]The mystery of ip
  • [BZOJ4010]菜肴制作
  • [fsevents@^2.1.2] optional install error: Package require os(darwin) not compatible with your platfo