题解 P1073 【最优贸易】

· · 题解

表示不会spfa,平生只会dp

cin>>x>>y>>z;
c[y-1].push_back(x-1);
if(z==2)c[x-1].push_back(y-1);

对于样例输入,我是反过来存储的(y在前),表示从哪个城市可以把东西买过来卖掉, 例如1 2 1,就说明2城市可以从1城市把东西买过来卖掉

m[i]=max(m[i],v[i]-v[*it]+m[*it]);

开始的时候,2城市获利为2,计算3城市的时候要加上2城市获利,3城市获利4, 所以式子里面要加上m[*it]

ans[i]=max(ans[i],max(ans[*it],m[*it]));

最后献上22行代码(534ms, 5432KB),压行真爽

#include <bits/stdc++.h>
using namespace std;
int v[100005],m[100005],ans[100005];
vector<int> c[100005];
vector<int>::iterator it;
int main()
{
    int i=0,N,M,x,y,z;  
    for(cin>>N>>M;i<N;i++)cin>>v[i];
    for(i=0;i<M;i++){
        cin>>x>>y>>z;
        c[y-1].push_back(x-1);
        if(z==2)c[x-1].push_back(y-1);
    }
    for(i=0;i<N;i++)
        for(it=c[i].begin();it!=c[i].end();it++){
            m[i]=max(m[i],v[i]-v[*it]+m[*it]);
            ans[i]=max(ans[i],max(ans[*it],m[*it]));
        }
    cout<<ans[N-1]<<endl;
    return 0;
}