待补 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; }
                    
                
                
            
        
浙公网安备 33010602011771号