[LUOGU] P2966 [USACO09DEC]牛收费路径Cow Toll Paths

暴力的想法是
\[ f[i][j]=\min\{f[i][k]+f[k][j]\}\\ g[i][j]=f[i][j]+\max\{val[i],val[j],val[k]\} \]
但是这样并不能保证真的取到路径上的点权最大值,Floyd中的k并没有给我们什么好的性质

但是Floyd的拓扑序是人定的,只是习惯从1到\(n\)而已

因此我们按点权排序,保证点权递增,这个式子就是正确的了

#include
#include
#include
#include

using namespace std;

inline int rd(){
  int ret=0,f=1;char c;
  while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
  while(isdigit(c))ret=ret*10+c-'0',c=getchar();
  return ret*f;
}
#define space putchar(' ')
#define nextline putchar('\n')
void _(int x){if(!x)return;_(x/10);putchar('0'+x%10);}
void out(int x){if(!x)putchar('0');_(x);}

const int MAXN = 300;

int f[MAXN][MAXN],g[MAXN][MAXN];
int val[MAXN],id[MAXN];
int n,m,q;

inline void upmin(int &x,int y){x=min(x,y);}

bool cmp(int x,int y){
  return val[x]

转载于:https://www.cnblogs.com/ghostcai/p/9804397.html

你可能感兴趣的:([LUOGU] P2966 [USACO09DEC]牛收费路径Cow Toll Paths)