最优贸易(记忆化搜索)

简介: 最优贸易(记忆化搜索)

题目链接:[NOIP2009 提高组] 最优贸易 - 洛谷


思路:这道题的标签是SPFA,但是我觉得这道题可以用记忆化搜索,用两组dfs,将从1到 i点道路上的最小值都存进min数组,将i 到n点的最大值存进max组,最后遍历min与max两数组的最大差值,输出即可。其中借助vector容器将每个点连通的点都遍历到。


AC代码:


#include<bits/stdc++.h>
using namespace std;
vector<int>way_min[110000];
vector<int>way_max[110000];
int value[110000],minn[110000],maxx[110000];
void dfs_min(int x,int m)
{ 
  if(m>=minn[x])
  return ;
  m=min(m,value[x]);
  minn[x]=m;
  for(int i=0;i<way_min[x].size();i++)
  {
  dfs_min(way_min[x][i],m);
  }
}
void dfs_max(int x,int m)
{
  if(m<=maxx[x])
  return ;
  m=max(m,value[x]);
  maxx[x]=m;
  for(int i=0;i<way_max[x].size();i++)
  {
  dfs_max(way_max[x][i],m);
  }
}
int main()
{
  int n,m,x,y,z,ans=0;
  cin>>n>>m;
  for(int i=1;i<=n;i++)
  {
  cin>>value[i];
  minn[i]=1000;
  maxx[i]=-1000;
  }
  for(int i=1;i<=m;i++)
  {
  cin>>x>>y>>z;
  way_min[x].push_back(y);
  way_max[y].push_back(x);
  if(z==2)
  {
    way_min[y].push_back(x);
    way_max[x].push_back(y);
  }
  }
  dfs_min(1,value[1]);
  dfs_max(n,value[n]);
  for(int i=1;i<=n;i++)
  ans=max(ans,maxx[i]-minn[i]);
  cout<<ans<<endl;
  return 0;
}

目录
相关文章
|
10月前
|
算法 测试技术 C#
【广度优先搜索】【分类讨论】900. 最佳运动员的比拼回合
【广度优先搜索】【分类讨论】900. 最佳运动员的比拼回合
|
19天前
|
存储 算法 JavaScript
【动态规划篇】股海擒龙诀:精准狙击股票买卖最佳时机
【动态规划篇】股海擒龙诀:精准狙击股票买卖最佳时机
|
5月前
|
算法 Java 调度
【贪心算法】 藏匿的刺客(C/C++)
【贪心算法】 藏匿的刺客(C/C++)
|
10月前
|
测试技术 Windows
【动态规划】879. 盈利计划
【动态规划】879. 盈利计划
|
算法 搜索推荐
算法分析 | 第一套(渐近分析)
算法分析 | 第一套(渐近分析)
84 0
挤奶牛奶预备事项(应用的数学分析,贪心思想)
挤奶牛奶预备事项(应用的数学分析,贪心思想)
58 0
|
算法 数据格式 异构计算
|
机器学习/深度学习 算法
<<算法很美>>——(六)——回溯算法(下)—N皇后问题
<<算法很美>>——(六)——回溯算法(下)—N皇后问题
<<算法很美>>——(六)——回溯算法(下)—N皇后问题
|
缓存 算法 网络协议
贪心法
贪心法是把一个复杂问题分解为一系列较为简单的局部最优选择,每一步选择都是对当前解的一个扩展,直到获得问题的完整解。贪心法的典型应用是求解最优化问题,而且对许多问题都能得到整体最优解,即使不能得到整体最优解,通常也是最优解的很好近似。
|
算法
【贪心法】会场安排问题
【贪心法】会场安排问题
280 0

热门文章

最新文章