【分层图最长路,spfa】P1073 最优贸易

  1 #include<iostream>
  2 #include<string>
  3 #include<queue>
  4 #include<stack>
  5 #include<vector>
  6 #include<map>
  7 #include<cstdio>
  8 #include<cstdlib>
  9 #include<algorithm>
 10 #include<set>
 11 #include<list>
 12 #include<iomanip>
 13 #include<cstring>
 14 #include<cmath>
 15 #include<limits>
 16 using namespace std;
 17
 18 #define au auto
 19 #define debug(i) cout<<"<debug> "<<i<<" <\debug>"<<endl
 20 #define mfor(i,a,b) for(register int i=(a);i<=(b);i++)
 21 #define mrep(i,a,b) for(register int i=(a);i>=(b);i--)
 22 #define LLL __int128
 23 #define Re register
 24 #define il inline
 25 #define mem(a,b) memset(a,(b),sizeof(a))
 26 typedef pair<int, int> intpair;
 27 typedef pair<long long int, long long int> llpair;
 28 typedef long long int LL;
 29 const int INF = 0x3f3f3f3f;
 30 const long long int INFLL = 0x3f3f3f3f3f3f3f3f;
 31
 32 int cnt;
 33 int n, m;
 34 const int maxn = 300010;
 35 int v[maxn];
 36
 37 struct Edge
 38 {
 39     int u, nxt;
 40     int w;
 41 }e[maxn * 3];
 42
 43 int head[maxn * 3];
 44
 45 void add(int a, int b, int w)
 46 {
 47     e[++cnt].u = b;
 48     e[cnt].nxt = head[a];
 49     head[a] = cnt;
 50     e[cnt].w = w;
 51 }
 52
 53 int dis[maxn * 3];
 54 bool vis[maxn * 3];
 55 queue<int>q;
 56
 57 void spfa(int x)
 58 {
 59     mem(dis, -0x3f);
 60     mem(vis, false);
 61     dis[x] = 0;
 62     q.push(x);
 63     vis[x] = true;
 64     while (!q.empty())
 65     {
 66         int t = q.front();
 67         q.pop();
 68         vis[t] = false;
 69         for (Re int i = head[t]; i != -1; i = e[i].nxt)
 70         {
 71             int u = e[i].u;
 72             int w = e[i].w;
 73             if (dis[u] < dis[t] + w)
 74             {
 75                 dis[u] = dis[t] + w;
 76                 if (!vis[u])
 77                 {
 78                     q.push(u);
 79                     vis[u] = true;
 80                 }
 81             }
 82         }
 83     }
 84 }
 85
 86 int main()
 87 {
 88     mem(head, -1);
 89     cin >> n >> m;
 90     mfor(i, 1, n) cin >> v[i];
 91     mfor(i, 1, m)
 92     {
 93         int a, b, c;
 94         cin >> b >> c >> a;
 95         add(b, c, 0);
 96         add(n + b, n + c, 0);
 97         add((n << 1) + b, (n << 1) + c, 0);
 98         add(b, n + c, -v[b]);
 99         add(n + b, (n << 1) + c, v[b]);
100         if (a == 2)
101         {
102             add(c, b, 0);
103             add(n + c, n + b, 0);
104             add((n << 1) + c, (n << 1) + b, 0);
105             add(c, n + b, -v[c]);
106             add(n + c, (n << 1) + b, v[c]);
107         }
108     }
109     add(n, 3 * n + 1, 0);
110     add(n * 3, n * 3 + 1, 0);
111     spfa(1);
112     cout << dis[n * 3 + 1];
113     return 0;
114 }

原文地址:https://www.cnblogs.com/thjkhdf12/p/11766328.html

时间: 2024-11-13 07:58:28

【分层图最长路,spfa】P1073 最优贸易的相关文章

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

P1073 最优贸易:https://www.luogu.org/problemnew/show/P1073 题意: 有n个城市,每个城市对A商品有不同的定价,问从1号城市走到n号城市可以最多赚多少差价.(旅游为主,赚钱为辅,所以买入和卖出只进行一次. 思路: 建一个有三层的图,三层都是相同的普通的城市路线,第一层向第二层连从第i个城市买入商品的花费,第二层向第三层连从第i个城市卖出商品的所得.从1 向 第一层的终点 ,向第三层的终点跑一遍最大路就行了. #include <algorithm>

P1073 最优贸易

P1073 最优贸易 题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路,双向通行的道路在统计条数时也计为 1 条. C 国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价 格不一定相同.但是,同一种商品在同一个城市的买入价和卖出价始终是相同的. 商人阿龙来到 C 国旅游.当他得知同一种商品在不同城市的价格可能会不同这一信息

luogu P1073 最优贸易

luogu P1073 最优贸易 2017-09-14 题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为 1 条. C 国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同.但是,同一种商品在同一个城市的买入价和卖出价始终是相同的. 商人阿龙来到 C 国旅游.当他得知同一种商品在不同

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

P1073 最优贸易 题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路,双向通行的道路在统计条数时也计为 1 条. C 国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价 格不一定相同.但是,同一种商品在同一个城市的买入价和卖出价始终是相同的. 商人阿龙来到 C 国旅游.当他得知同一种商品在不同城市的价格可能会不同这一信息

HDU.1529.Cashier Employment(差分约束 最长路SPFA)

题目链接 \(Description\) 给定一天24h 每小时需要的员工数量Ri,有n个员工,已知每个员工开始工作的时间ti(ti∈[0,23]),每个员工会连续工作8h. 问能否满足一天的需求.若能,输出最少需要多少员工. \(Solution\) 参考. 既然给的是开始工作时间,那么就先根据开始时间做 设Ai表示在i时开始工作的人数(未知),Bi表示i时可工作人数的上限(已知) 那么有:(注意可以跨天) A[i-7]+A[i-6]+...+A[i-1]+A[i] >= R[i] (7 <

POJ.1752.Advertisement(差分约束 最长路SPFA)

题目链接 \(Description\) 有n个人在一条直线上跑步,每个人的起点 \(Si\).终点 \(Ei\) 已知:每个点可以放一个广告牌,一个人i能看到的广告牌数量为 \(Ei-Si+1\). 要求使每个人看到的广告牌数量不小于 \(k\) (若 \(Ei-Si+1<k\) 则应看到 \(Ei-Si+1\)).输出最少需要多少广告牌及方案. (这翻译2333) \(Solution\) 设 \(Sum_i\) 表示在 \([1,i]\) 广告牌总数,那么由题意有 \(Sum_{Ei}-S

【luogu P1073 最优贸易】 题解

题目链接:https://www.luogu.org/problemnew/show/P1073 对于状态量相互影响的题目,分层图是个不错的想法. 考虑在题目中分为: 不交易: 直接从1到n出去,为0 交易: 先在某点买入,再从该点后所在路径上卖出. 买入卖出是两个操作,考虑可以分开在两张图上做,于是就有了分层图,共三张图. 我们把原图中的路径都设边权为0,表示在这条路上走对交易利润无影响,在第一张图上买入后,我们就走到下一张图,准备卖出操作. 设u->v 所以若从u点买入,到下一条边的v,即v

P1073 最优贸易 (tarjan缩点+dp)

题目链接:https://www.luogu.com.cn/problem/P1073. C国有n n n个大城市和m mm 条道路,每条道路连接这 nnn个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 mmm 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为 11 1条. CC C国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同.但是,同一种商品在同一个城市的买入价和卖出价始终是相同的. 商人阿

P1073 最优贸易 分层图最短路

题目描述 CC国有nn个大城市和mm 条道路,每条道路连接这 nn个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 mm 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的道路在统计条数时也计为 11条. CC国幅员辽阔,各地的资源分布情况各不相同,这就导致了同一种商品在不同城市的价格不一定相同.但是,同一种商品在同一个城市的买入价和卖出价始终是相同的. 商人阿龙来到 CC 国旅游.当他得知同一种商品在不同城市的价格可能会不同这一信息之后,便决定在旅游的同时,