P2176 [USACO14FEB]路障Roadblock
题意:一个图, n 个点 m 条边,求将任意一条边距离翻倍后 使 1−n 最短路径增加的最大增量.
solution
- 如果有两条最短路,那么增量为零,所以有意义的答案只会有一条最短路(独立的)
- 所以我们先搜出这条最短路,其实就是找出最短路图,考虑到n<=250,所以尝试增大最短路(最短路上最多n-1条边)上的每一条边,跑一边dijkstra,计算答案
- 复杂度O(nmlogn)
- trick 最短路图上的边一定是有向的
code
int dis[N];
bool vis[N];
priority_queue <pair <int,int> > q;
void dijkstra()
{
memset(dis,inf,sizeof(dis));
memset(vis,false,sizeof(vis));
dis[1]=0;
q.push(make_pair(0,1));
while(!q.empty())
{
int u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=true;
for(int i=head[u];i;i=edge[i].nxt)
{
int v=edge[i].v;
int w=edge[i].w;
if(dis[u]+w<dis[v])
{
dis[v]=dis[u]+w;
q.push(make_pair(-dis[v],v));