POJ 3268 Silver Cow Party

题目链接:POJ 3268 Silver Cow Party

题目大意:

题解:
存两张图:
第一张图正常存边,用于求从x返回其他点时的最短路。
第二张图存第一张图的反向边,由于从其他点到x是多源单终点,存反向边则可以看作是从x到其他点,再求一遍最短路。
将各点在两次最短路里的dis值相加,更新最大值。

#include <cstring>
#include <iostream>
#include <queue>
using namespace std;

#define INF 0x3f3f3f3f
#define io_speed_up ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)

int cnt[2], head[2][1010], dis[2][1010], n, m, x;
bool vis[1010];
struct Edge {
    int v, w, next;
} edge[2][100010];

void addEdge(int k, int u, int v, int w) {
    edge[k][++cnt[k]].v = v;
    edge[k][cnt[k]].w = w;
    edge[k][cnt[k]].next = head[k][u];
    head[k][u] = cnt[k];
}

void spfa(int s, int k) {
    queue<int> q;
    memset(vis, 0, sizeof(vis));
    for (int i = 1; i <= n; ++i) {
        dis[k][i] = INF;
    }
    dis[k][s] = 0;
    vis[s] = true;
    q.push(s);
    while (!q.empty()) {
        int u = q.front();
        vis[u] = false;
        q.pop();
        for (int i = head[k][u]; i; i = edge[k][i].next) {
            int v = edge[k][i].v;
            if (dis[k][v] > dis[k][u] + edge[k][i].w) {
                dis[k][v] = dis[k][u] + edge[k][i].w;
                if (!vis[v]) {
                    q.push(v);
                    vis[v] = true;
                }
            }
        }
    }
}

int main() {
    io_speed_up;
    cin >> n >> m >> x;
    for (int i = 1, u, v, w; i <= m; ++i) {
        cin >> u >> v >> w;
        addEdge(0, u, v, w);
        addEdge(1, v, u, w);
    }
    spfa(x, 0);
    spfa(x, 1);
    int ans = 0;
    for (int i = 1; i <= n; ++i) {
        ans = max(ans, dis[0][i] + dis[1][i]);
    }
    cout << ans << endl;
    return 0;
}
posted @   ZZHHOOUU  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示