2009NOIP最优贸易(此题证明了思维的重要性)

本文介绍了一种结合最短路径快速算法(SPFA)与深度优先搜索(DFS)解决图论中特定问题的方法。通过实例解析,展示了如何高效地找到从起点到终点的最大收益路径。

看题,上手,spfa,bfs,爆零。。
看了一位dalao的题解深深地感悟到了思维的重要性。上题。
题目戳这里
原版戳这里


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define inf 0x3f3f3f3f
#define maxn 100005
using namespace std;
int n,m,x,y,z;
int v[maxn],v_min[maxn],ans[maxn];
vector<int>edge[maxn];
void dfs(int now,int pre,int min_v)//现在,上一个点,当前为止最小商品价格 
{
    bool flag=1;
    min_v=min(v[now],min_v);//更新最小价值 
    if(v_min[now]>min_v) 
    {
        v_min[now]=min_v; 
        flag=0;
    }
    int max_v=max(ans[pre],v[now]-min_v);//dp 
    if(ans[now]<max_v) 
    {
        ans[now]=max_v; flag=0;
    }
    if(flag) return;//要弹出,不需要其他情况,想MLE可以不加 
    for(int i=0;i<edge[now].size();i++)
        dfs(edge[now][i],now,min_v);//继续dfs 
} 
int main()
{
    cin>>n>>m;
    for(int i=0;i<maxn;i++) v_min[i]=inf; 
    for(int i=1;i<=n;i++) cin>>v[i];
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y>>z;
        if(z==1) edge[x].push_back(y);
        else
        {
            edge[x].push_back(y);
            edge[y].push_back(x);
        }
    }
    dfs(1,0,inf);//初始状态 
    cout<<ans[n]<<endl;
}

像您这样长得帅又能AK NOI并且还点赞关注的人已经不多了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值