zoukankan      html  css  js  c++  java
  • [USACO11DEC] RoadBlock S

    给定 (n leq 100) 个点,(m leq 5000) 条边的无向图,允许你修改一条边的长度使其翻倍,最大化 (1 o 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;
    }
    
    
  • 相关阅读:
    客户端技术的一点思考(数据存储用SQLite, XMPP通讯用Gloox, Web交互用LibCurl, 数据打包用Protocol Buffer, socket通讯用boost asio)
    自绘LISTVIEW的滚动条(Delphi实现)
    文字滚屏控件(SliderPanel)
    自动注册服务NET Core扩展IServiceCollection
    Three.js基础
    Cordova+Asp.net Mvc+GIS
    Netty
    TagHelper
    jQuery、实例大全
    React和Angular
  • 原文地址:https://www.cnblogs.com/mollnn/p/12491102.html
Copyright © 2011-2022 走看看