• 最优贸易


     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 const int maxn=1e5+7;
     5 const int maxm=5e5+7;
     6 const int inf=0x7f7f7f7f;
     7 int n,m,num;
     8 int head[maxn],val[maxn],f[maxn],mi[maxn];
     9 int read(){
    10     int f=1;int x=0;char s=getchar();
    11     while(s<'0'||s>'9') {if(s=='-') f=-1;s=getchar();}
    12     while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    13     x*=f;
    14     return x;
    15 }
    16 struct Edge{
    17     int next,to;
    18 }edge[maxm];
    19 void add(int from,int to){
    20     edge[++num].next=head[from];
    21     edge[num].to=to;
    22     head[from]=num;
    23 }
    24 void dfs(int x,int pre,int minn){
    25     bool flag=1;
    26     minn=min(minn,val[x]);
    27     if(mi[x]>minn){mi[x]=minn;flag=false;}
    28     int maxx=max(f[pre],val[x]-minn);
    29     if(f[x]<maxx){f[x]=maxx;flag=false;}
    30     if(flag==true) return;
    31     for(int i=head[x];i;i=edge[i].next){
    32         int v=edge[i].to;
    33         dfs(v,x,minn);
    34     }
    35 }
    36 int main(){
    37     cin>>n>>m;
    38     for(int i=1;i<=n;i++) cin>>val[i];
    39     for(int i=1;i<=m;i++){
    40         int x,y,z;x=read();y=read();z=read();
    41         if(z==1) add(x,y);
    42         if(z==2) {add(x,y);add(y,x);}
    43     }
    44     for(int i=1;i<=n;i++) mi[i]=inf;
    45     dfs(1,0,inf);
    46     cout<<f[n]<<endl;
    47     return 0;
    48 } 
  • 相关阅读:
    Android 侧滑(双向滑动菜单)效果
    Android中PopupWindow中有输入框时无法弹出输入法的解决办法
    Android 调用图库选择图片实现和参数详解
    5.抽象类篇
    4.事件篇
    3.委托篇
    2.结构篇
    1.枚举篇
    读取excel到数据库里面
    Windows系统安装docker
  • 原文地址:https://www.cnblogs.com/lcan/p/9570929.html
Copyright © 2020-2023  润新知