次元传送门:洛谷P1073

思路

一开始看题目嗅出了强连通分量的气息 但是嫌长没打 听机房做过的dalao说可以用分层图 从来没用过 就参考题解了解一下

因为每个城市可以走好几次 所以说我们可以在图上随意走动

所以第一层图就建一个边权为0的图 随意走动不影响

考虑在某个点买入水晶球

建立一条有向边到新图上 边权为-w[i] 指向i所能到达的点(第二层图中)

它表示:假如我选择走了这条边,就是我在这个点买了这个水晶球,我不会反悔,并且我接下来考虑在某个点卖它。

考虑在某个点卖出水晶球

从第二层图建立一条有向边到新图中 边权为w[i] 指向i所能到达的点(第三层图中)

它表示:假如我选择走了这条边,就是我在这个点卖了这个水晶球,我不会反悔,并且我接下来考虑走向终点。

现在我们只需要从第一层图走到第二层图再走到第三层图再走到终点即可 而且分层图把所有情况考虑到了

走向终点有两种情况

  • 不买卖直接走向终点 在第一层图的终点连一条有向边 边权为0 到最后终点
  • 要买卖再走向终点 在第三层图的终点连一条有向边 边权为0 到最后终点

由于有向边的建立,你不能从第二/三层走回第一层图,这保证了你只做一次买卖,而不是无限做买卖,符合了题目的要求(分层图的意义)

而我们最终的答案 就是求从第一层图的1号点 经过三层图走到“最后终点”的最长路

来自你谷dalao的图解:

代码

  1. #include<iostream>
  2. #include<vector>
  3. #include<queue>
  4. using namespace std;
  5. #define maxn 100010
  6. #define INF 1e9+7
  7. struct Edge
  8. {
  9. int v;
  10. int len;
  11. };
  12. int n,m;
  13. bool vis[maxn*+];
  14. int w[maxn],dis[maxn*+];
  15. vector <Edge> G[maxn*+];
  16. void spfa()//常规SPFA
  17. {
  18. for(int i=;i<=n;i++) dis[i]=-INF;
  19. queue <int> q;
  20. q.push();
  21. dis[]=;
  22. vis[]=;
  23. while(!q.empty())
  24. {
  25. int u=q.front();
  26. q.pop();
  27. vis[u]=;
  28. for(int i=;i<G[u].size();i++)
  29. {
  30. Edge x=G[u][i];
  31. if(dis[x.v]<dis[u]+x.len)
  32. {
  33. dis[x.v]=dis[u]+x.len;
  34. if(!vis[x.v])
  35. {
  36. vis[x.v]=;
  37. q.push(x.v);
  38. }
  39. }
  40. }
  41. }
  42. }
  43. void add(int u,int v)
  44. {
  45. G[u].push_back((Edge){v,});//第一层
  46. G[n+u].push_back((Edge){n+v,});//第二层 用n+1到2*n
  47. G[*n+u].push_back((Edge){*n+v,});//第三层 用2*n+1到3*n
  48. G[u].push_back((Edge){n+v,-w[u]});//从第一层到第二层
  49. G[u+n].push_back((Edge){*n+v,w[u]});//从第二层到第三层
  50. }
  51. int main()
  52. {
  53. cin>>n>>m;
  54. for(int i=;i<=n;i++) cin>>w[i];
  55. for(int i=;i<=m;i++)
  56. {
  57. int x,y,z;
  58. cin>>x>>y>>z;
  59. add(x,y);
  60. if(z==) add(y,x);
  61. }
  62. G[n].push_back((Edge){*n+,});//第一层终点到最后终点
  63. G[*n].push_back((Edge){*n+,});//第三层终点到最后终点
  64. n=*n+;//更改最后终点
  65. spfa();
  66. cout<<dis[n];
  67. }

【题解】洛谷P1073 [NOIP2009TG] 最优贸易(SPFA+分层图)的更多相关文章

  1. 【洛谷P1073】最优贸易

    题目大意:给定一个 N 个点,M 条边(存在反向边)的有向图,点有点权,求一条从 1 到 N 的路径上,任意选出两个点 p,q (p 在前,q在后),两点点权的差值最大. 根据最短路的 dp 思想,可 ...

  2. 【洛谷 P1073】 最优贸易 (Tarjan缩点+拓扑排序)

    题目链接 先\(Tarjan\)缩点,记录每个环内的最大值和最小值. 然后跑拓扑排序,\(Min[u]\)表示到\(u\)的最小值,\(ans[u]\)表示到\(u\)的答案,\(Min\)和\(an ...

  3. P1073 最优贸易 建立分层图 + spfa

    P1073 最优贸易:https://www.luogu.org/problemnew/show/P1073 题意: 有n个城市,每个城市对A商品有不同的定价,问从1号城市走到n号城市可以最多赚多少差 ...

  4. 洛谷1073 NOIP2009 最优贸易

    题目大意 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双 ...

  5. [luogu1073 Noip2009] 最优贸易 (dp || SPFA+分层图)

    传送门 Description C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分 为 ...

  6. 洛谷 P1073 最优贸易 解题报告

    P1073 最优贸易 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这\(m\)条道路中有一部分 ...

  7. 洛谷P1073 最优贸易 [图论,DP]

    题目传送门 最优贸易 题目描述 C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分为双向 ...

  8. 【洛谷P1073】[NOIP2009]最优贸易

    最优贸易 题目链接 看题解后感觉分层图好像非常NB巧妙 建三层n个点的图,每层图对应的边相连,权值为0 即从一个城市到另一个城市,不进行交易的收益为0 第一层的点连向第二层对应的点的边权为-w[i], ...

  9. 洛谷P1073 最优贸易==codevs1173 最优贸易

    P1073 最优贸易 题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一 ...

随机推荐

  1. 洛谷P3763 [TJOI2017]DNA(后缀数组 RMQ)

    题意 题目链接 Sol 这题打死我也不会想到后缀数组的,应该会全程想AC自动机之类的吧 但知道这题能用后缀数组做之后应该就不是那么难了 首先把\(S\)和\(S0\)拼到一起跑,求出Height数组 ...

  2. display:table和display:table-cell的妙用

    display的table和table-cell一般情况下用的不多,所以很少有人去关注它,但他们两个联手起来会给你惊喜! 这里抛出这样一个问题,如下,让块里的多行文字垂直居中?一说到垂直居中就会想到, ...

  3. [算法练习]Add Two Numbers

    题目说明: You are given two linked lists representing two non-negative numbers. The digits are stored in ...

  4. Android图片处理--缩放

    PS:在开发中我们会遇到一些图片处理问题,比如说缓存图片了.限制图片大小了.查看图片了等.上一篇文章介绍了图片的全景效果查看,今天介绍一个图片缩放,我们如果有时间的话,可以自己写一个属于自己的库,里面 ...

  5. Python3 中日语料分句实现

    0. 背景 因为最近在看平行语料句对齐.词对齐的缘故,想做对齐的话需要先做一个分句. 一开始利用正则和引号开关标志写了一种方法,中间想到一个小技巧,写出来比较简单通用,想把这一小段代码分享一下. 1. ...

  6. what's up ? docker, all right.

    Docker install 下载对应安装包,离线安装 Docker 需要 docker-engine.docker-engine-selinux.libtool-ltdl这三个软件包. 下面以安装 ...

  7. vue从安装到初始化项目

  8. FTP作业

    实现一个FTP网盘的功能 pa's's

  9. 配置Sharepoint之后。外网无法访问的问题

    Sharepoint配置完成了,projectserver也已经配置完毕.突然遇到一个情况就是外网访问不了,这可麻烦了,费了半天事访问不了等于0啊.没办法,研究吧.在群里问了大神,终于解决了.现将解决 ...

  10. Python学习---JSON学习180130

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON是用字符串来表示Javascript对象: Json字符串就是js对象的一种表现形式(字符串的形式 ...