【题意概述】
给出一个图,点有正点权,边有正边权,通过两点的代价为两点间的最短路加上路径通过的点的点权最大值。
有M个询问,每次询问通过两点的代价。
【题解】
先把点按照点权从小到大排序,然后按照这个顺序跑floyed. 这样的话当前路径i-->k-->j的点权最大值只会在i,j,k中产生,用一个ans[i][j]数组维护代价即可。
1 #include2 #include 3 #include 4 #define LL long long 5 #define rg register 6 #define N 300 7 using namespace std; 8 int n,m,q,f[N][N],ans[N][N],poi[N]; 9 struct rec{10 int c,num;11 }a[N];12 inline int read(){13 int k=0,f=1; char c=getchar();14 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();15 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();16 return k*f;17 }18 inline void Pre(){19 for(rg int i=0;i<=n;i++)20 for(rg int j=0;j<=n;j++) f[i][j]=ans[i][j]=1e9;21 for(rg int i=0;i<=n;i++) f[i][i]=ans[i][i]=0;22 }23 inline int mx(int a,int b,int c){24 int t=-2e9;25 if(a>t)t=a;26 if(b>t)t=b;27 if(c>t)t=c;28 return t;29 }30 inline bool cmp(rec a,rec b){ return a.c