ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

最优贸易

2021-05-29 19:05:15  阅读:209  来源: 互联网

标签:dis1 dis2 include int v2 贸易 最优 now


嘟嘟嘟

 

换句话说,就是寻找一条从1到n的路径,使路径上两点x, y(先经过x再经过y)使val[x] - val[y]最大。

还可以用dp的思想来做这道题:令dis1[x]表示1到x的所有路径中val最小的点,dis2[x]表示从t到x的所有路径中val最大的点,这样答案就是max(dis2[x] - dis1[x])。

用dijkstra就可以实现这个dp。

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cmath>
  4 #include<algorithm>
  5 #include<cstring>
  6 #include<cstdlib>
  7 #include<cctype>
  8 #include<vector>
  9 #include<stack>
 10 #include<queue>
 11 using namespace std;
 12 #define enter puts("") 
 13 #define space putchar(' ')
 14 #define Mem(a) memset(a, 0, sizeof(a))
 15 typedef long long ll;
 16 typedef double db;
 17 const int INF = 0x3f3f3f3f;
 18 const db eps = 1e-8;
 19 const int maxn = 1e5 + 5;
 20 inline ll read()
 21 {
 22     ll ans = 0;
 23     char ch = getchar(), last = ' ';
 24     while(!isdigit(ch)) {last = ch; ch = getchar();}
 25     while(isdigit(ch)) {ans = ans * 10 + ch - '0'; ch = getchar();}
 26     if(last == '-') ans = -ans;
 27     return ans;
 28 }
 29 inline void write(ll x)
 30 {
 31     if(x < 0) x = -x, putchar('-');
 32     if(x >= 10) write(x / 10);
 33     putchar(x % 10 + '0');
 34 }
 35 
 36 int n, m, a[maxn];
 37 vector<int> v[maxn], v2[maxn];
 38 
 39 #define pr pair<int, int>
 40 #define mp make_pair
 41 int dis1[maxn];
 42 bool in[maxn];
 43 void dij1(int s)
 44 {
 45     for(int i = 1; i <= n; ++i) dis1[i] = INF;
 46     dis1[s] = a[s];
 47     priority_queue<pr, vector<pr>, greater<pr> > q; q.push(mp(dis1[s], s));
 48     while(!q.empty())
 49     {
 50         int now = q.top().second; q.pop();
 51         if(in[now]) continue;
 52         in[now] = 1;
 53         for(int i = 0; i < (int)v[now].size(); ++i)
 54         {
 55             if(dis1[v[now][i]] > min(dis1[now], a[v[now][i]]))
 56             {
 57                 dis1[v[now][i]] = min(dis1[now], a[v[now][i]]);
 58                 q.push(mp(dis1[v[now][i]], v[now][i]));    
 59             }
 60         }
 61     }
 62 }
 63 
 64 int dis2[maxn];
 65 void dij2(int s)
 66 {
 67     Mem(in);
 68     dis2[s] = a[s];
 69     priority_queue<pr> q; q.push(mp(dis1[s], s));
 70     while(!q.empty())
 71     {
 72         int now = q.top().second; q.pop();
 73         if(in[now]) continue;
 74         in[now] = 1;
 75         for(int i = 0; i < (int)v2[now].size(); ++i)
 76         {
 77             if(dis2[v2[now][i]] < max(dis2[now], a[v2[now][i]]))
 78             {
 79                 dis2[v2[now][i]] = max(dis2[now], a[v2[now][i]]);
 80                 q.push(mp(dis2[v2[now][i]], v2[now][i]));    
 81             }
 82         }
 83     }
 84 }
 85 
 86 int ans = 0;
 87 
 88 int main()
 89 {
 90     n = read(); m = read();
 91     for(int i = 1; i <= n; ++i) a[i] = read();
 92     for(int i = 1; i <= m; ++i)
 93     {
 94         int x = read(), y = read(), z = read();
 95         v[x].push_back(y); v2[y].push_back(x); 
 96         if(z == 2) v[y].push_back(x), v2[x].push_back(y);
 97     }
 98     dij1(1);
 99     dij2(n);
100     for(int i = 1; i <= n; ++i) ans = max(ans, dis2[i] - dis1[i]);
101     write(ans); enter;
102     return 0;
103 }
View Code

 

标签:dis1,dis2,include,int,v2,贸易,最优,now
来源: https://blog.51cto.com/u_15234622/2830915

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有