【正经题解】最优贸易
2024-02-20 16:32:22
发布于:浙江
36阅读
0回复
0点赞
SPFA算法,第v[i]点为从1到i一路上最小值,t[i]表示从i到n的最大值
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
int a[100001],tb[100001],ta[100001];
vector<int> g[100001],gf[100001];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;++i)
{
cin>>a[i];
}
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
g[x].push_back(y);
gf[y].push_back(x);
if(z==2)
{
g[y].push_back(x);
gf[x].push_back(y);
}
}
queue<int> q;
q.push(1);
memset(ta,127,sizeof(ta));
ta[1]=2147483647;
while(!q.empty())
{
int t=q.front();
q.pop();
ta[t]=min(ta[t],a[t]);
int l=g[t].size();
for(int i=0;i<l;i++)
{
if(ta[t]<ta[g[t][i]])
{
ta[g[t][i]]=ta[t];
q.push(g[t][i]);
}
}
}
q.push(n);
while(!q.empty())
{
int t=q.front();
q.pop();
tb[t]=max(tb[t],a[t]);
int l=gf[t].size();
for(int i=0;i<l;i++)
{
if(tb[t]>tb[gf[t][i]])
{
tb[gf[t][i]]=tb[t];
q.push(gf[t][i]);
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,tb[i]-ta[i]);
}
cout<<ans;
return 0;
}
这里空空如也
有帮助,赞一个