[USACO11DEC] RoadBlock S – 最短路

给定 \(n \leq 100\) 个点,\(m \leq 5000\) 条边的无向图,允许你修改一条边的长度使其翻倍,最大化 \(1\to n\) 最短路的长度增量

Solution

难度:L2
先任意求出一条最短路,然后枚举上面的一条边使其翻倍,再求最短路,取最大值即可

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define reset(x) memset(x,0,sizeof x)
#define reset3f(x) memset(x,0x3f,sizeof x)
const int N = 1e4+5;
int ww[1005][1005];
vector <pair<int,int> > ed;
namespace sp {
const int N=1e+5+5;
vector<pair<int,int> > g[N];
int n,v0=1,d[N],v[N];
void make(int t1,int t2,int t3) {
    g[t1].push_back(make_pair(t2,t3));
}
void reset_graph() {
    for(int i=0;i<=n;i++) g[i].clear();
}
void solve(int flag) {
    queue <int> qu;
    reset(v); reset3f(d);
    d[v0]=0; v[v0]=1; qu.push(v0);
    while(qu.size()) {
        int p=qu.front();
        qu.pop();
        v[p]=0;
        for(int i=0;i<g[p].size();i++) {
            int q=g[p][i].first,w=g[p][i].second;
            if(d[q]>d[p]+w) {
                d[q]=d[p]+w;
                if(!v[q]) qu.push(q), v[q]=1;
            }
        }
    }
    if(flag) {
        int p=n;
        while(p!=1) {
            int i;
            for(i=1;i<=n;i++) if(d[i]+ww[i][p]==d[p]) {
                break;
            }
            ed.push_back({i,p});
            p=i;
        }
    }
}
}

int n,m,u[N],v[N],w[N],f[N];
signed main() {
    ios::sync_with_stdio(false);
    reset3f(ww);
    cin>>n>>m;
    sp::n=n;
    for(int i=1;i<=m;i++) cin>>u[i]>>v[i]>>w[i], ww[u[i]][v[i]]=ww[v[i]][u[i]]=w[i];
    for(int i=1;i<=m;i++) sp::make(u[i],v[i],w[i]), sp::make(v[i],u[i],w[i]);
    sp::solve(1);
    int tans=sp::d[n];
    sp::reset_graph();
    int ans=0;
    for(int i=0;i<ed.size();i++) {
        for(int j=1;j<=m;j++) {
            if((u[j]==ed[i].first && v[j]==ed[i].second)||
               (v[j]==ed[i].first && u[j]==ed[i].second)) {
                sp::make(u[j],v[j],w[j]*2);sp::make(v[j],u[j],w[j]*2);
            }
            else {
                sp::make(u[j],v[j],w[j]);sp::make(v[j],u[j],w[j]);
            }
        }
        sp::solve(0);
        ans=max(ans,sp::d[n]);
        sp::reset_graph();
    }
    cout<<ans-tans;
}

原文链接: https://www.cnblogs.com/mollnn/p/12491102.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    [USACO11DEC] RoadBlock S - 最短路

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/373220

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月3日 上午11:38
下一篇 2023年3月3日 上午11:39

相关推荐