暴力枚举每条边免费再用dij求最短路复杂度为:n*m*k*logm;
需要进行优化:
我们发现:
把边i(x -> y)免费后对于路径 a -> b只有三种情况:
1:原本i不在 a->b最短路上,免费后也不在。
2:原本i不在 a->b最短路上,免费后在。
3:原本i在 a->b最短路上,免费后也在。
只需要判断下:
ds[a][b] 与 min(ds[a][x]+ds[y][b],ds[a][y]+ds[x][b])的大小关系即可。
若前者小于后者,说明 免费i,对于a->b没有影响
否则,减去差值影响。
这样只需要预处理最短路:n*nlogm
加上枚举免费边求每次的结果:m*k
复杂度是并列的。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define re register
#define ls (o<<1)
#define rs (o<<1|1)
//#define m (l+r)/2
#define pb push_back
typedef pair<int,int> pii;
const double PI= acos(-1.0);
const int M =1000+7;
int head[M],cnt=1;
void init(int n){cnt=1;f