[算法竞赛进阶指南]图论专题训练
[TOC] A:最优贸易 题意: 一个国家里有很多个城市,某件物品在所有城市的价格都不同,你可以在一个城市买,另一个城市卖出来获得利益,但是只能进行一次买卖。然后要从1走到n,1到n有单向,也有双向的。 题解:将图分层。邻接表,spfa求出最长路(最大权值)。有三层,一层是不购买也不卖,第二层是买,一到第二层的边权为负。第三层是卖,二到第三层的边权为正。由于有向边的建立,你不能从第二/三层走回第一层图,这保证了你只做一次买卖,而不是无限做买卖。然后再设置一个最终大终点。 其实这题还有很多方法 参考 https://www.luogu.org/problemnew/solution/P1073 #include <bits/stdc++.h> #define ll long long using namespace std; const ll mod=1e9+7; const ll maxn=1e5+7; const ll inf=1<<18; struct u { int v,len; }; int n,m,v[maxn],d[maxn*3+1]; vector<u> vt[maxn*3+1];//邻接表 template<class T> void read(T &res) { res = 0; char c = getchar(); T f = 1; while(c < '0'