待补 P1073 [NOIP2009 提高组] 最优贸易

->   >=2*m 不够准确

-> 看状态是否改变 -> mi[]-minx(c[],minx)  + f[]-maxx(c[]-minx,f[pre])

 

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define MAXN 100005
using namespace std;

vector<int> g[MAXN];
int n,m,f[MAXN],mi[MAXN],c[MAXN];
int head[MAXN],nxt[MAXN],to[MAXN],cnt=0;

void add(int u,int v)
{
    to[++cnt]=v;
    nxt[cnt]=head[u];
    head[u]=cnt;
}
/*
void dfs(int x,int minx,int dep) {
    if(dep>=2*m+1) return;
    if(c[x]-minx>ans) ans=c[x]-minx;
    minx=min(c[x],minx);
    for(int i=head[x];i;i=nxt[i]) dfs(to[i],minx,dep+1);
}
*/
void dfs(int x,int minx,int pre) {
    int flag=1; 
    minx=min(c[x],minx);
    if (mi[x]>minx) mi[x]=minx,flag=0;
    int maxx=max(f[pre],c[x]-minx);
    if (f[x]<maxx) f[x]=maxx,flag=0;
    
    if (flag) return;
    //for (int i=0;i<g[x].size();i++) dfs(g[x][i],minx,x);
    for(int i=head[x];i;i=nxt[i]) dfs(to[i],minx,x);
}

int main() {
    scanf("%d%d",&n,&m);
    for (int i=0;i<MAXN;i++) mi[i]=INF;
    for (int i=1;i<=n;i++) scanf("%d",&c[i]);
    for (int i=1;i<=m;i++) {
        int t1,t2,t3;
        scanf("%d%d%d",&t1,&t2,&t3);
        //g[t1].push_back(t2);
        //if (t3==2) g[t2].push_back(t1);
        add(t1,t2);
        if(t3==2) add(t2,t1);
    }
    dfs(1,INF,0);
    printf("%d\n",f[n]);
    return 0;
}
View Code

 

posted @ 2023-07-15 18:41  JMXZ  阅读(8)  评论(0)    收藏  举报