社区讨论

80pts求条(#6#7TLE)

P2176[USACO11DEC] RoadBlock S / [USACO14FEB] Roadblock G/S参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mkqpjy88
此快照首次捕获于
2026/01/23 17:58
4 周前
此快照最后确认于
2026/01/23 23:56
4 周前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int dis[105], pre[105], n, m, ans;
bool vis[105];
struct node{
    int id, w;
    bool operator <(const node &b) const{
        return w > b.w;
    }
};
struct edge{
    int id, w;
};
vector<edge> g[105];

int dijk(){
    memset(dis, 0x3f, sizeof dis);
    memset(vis, 0, sizeof vis);
    dis[1] = 0;
    priority_queue<node> q;
    q.push({1, 0});
    while(q.size()){
        int u = q.top().id, w = q.top().w;
        q.pop();
        if(vis[u]) continue;
        vis[u] = 1;
        for(auto it : g[u]){
            if(dis[u] + it.w < dis[it.id]){
                dis[it.id] = dis[u] + it.w;
                pre[it.id] = u;
                q.push({it.id, dis[it.id]});
            }
        }
    }
    return dis[n];
}

int main(){
    cin >> n >> m;
    for(int i = 1; i <= m; i++){
        int u, v, w;
        cin >> u >> v >> w;
        g[v].push_back({u, w});
        g[u].push_back({v, w});
    }
    int fdis = dijk();
    for(int now = n; now != 1; now = pre[now]){
        int u = now, v = pre[now], w = 0;
        for(auto &it : g[u]){
            if(it.id == v){
                w = it.w;
                it.w *= 2;
                break;
            }
        }
        for(auto &it : g[v]){
            if(it.id == u){
                it.w *= 2;
                break;
            }
        }
        ans = max(ans, dijk() - fdis);
        for(auto &it : g[u]){
            if(it.id == v){
                it.w /= 2;
                break;
            }
        }
        for(auto &it : g[v]){
            if(it.id == u){
                it.w /= 2;
                break;
            }
        }
    }
    cout << ans;
    return 0;
}
谢谢!

回复

2 条回复,欢迎继续交流。

正在加载回复...