[luogu1073][NOIP2009T3] 最优贸易

两次dfs(博主懒,懒得写SPFA或者bfs)分别求出从起点开始到点 i i 水晶球最小价格mn[i],以及从终点开始到点 i i 的水晶球最大价格mx[i],然后减一下最大的就是答案辣~

我丑陋的代码

#include<bits/stdc++.h>
using namespace std;
const int N=100002;
int n,m,mx[N],mn[N],b[N],ans,v[N];
vector<int> a[N],g[N];

void read(int &x){
    char ch=getchar();x=0;
    for(;ch<'0'||ch>'9';ch=getchar());
    for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
}

void dfs1(int x){
    mn[x]=min(mn[x],v[x]);
    if (b[x]) return;
    b[x]=1;
    for(int i=0;i<a[x].size();i++) mn[a[x][i]]=min(mn[a[x][i]],mn[x]),dfs1(a[x][i]);
}

void dfs2(int x){
    mx[x]=max(mx[x],v[x]);
    if (b[x]) return;
    b[x]=1;
    for(int i=0;i<g[x].size();i++) mx[g[x][i]]=max(mx[g[x][i]],mx[x]),dfs2(g[x][i]);
}

int main(){
//  freopen("1.in","r",stdin);    
//  freopen("1.out","w",stdout);
    read(n);read(m);
    for(int i=1;i<=n;i++) read(v[i]);
    for(int i=1;i<=m;i++){
        int x,y,z;
        read(x);read(y);read(z);
        a[x].push_back(y);g[y].push_back(x);
        if (z==2) a[y].push_back(x),g[x].push_back(y);
    }
    memset(mn,0x3f,sizeof mn);
    dfs1(1);
    memset(b,0,sizeof b);
    dfs2(n);
    for(int i=1;i<=n;i++) ans=max(ans,mx[i]-mn[i]);
    cout<<ans;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值