看题,上手,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并且还点赞关注的人已经不多了