求卡常
查看原帖
求卡常
531746
Composite_Function楼主2023/4/1 19:48
# include <bits/stdc++.h>
using namespace std;
# define int long long
const int N = 1e6 + 10;
int n, m, s, t1, t2, u, v, w;
int ans[N], pos;
bool vis[N];
struct Edge
{
    int next, to, val;
}edge[N];
int head[N], cnt;
void add(int u, int v, int w)
{
    edge[++cnt] = {head[u], v, w};
    head[u] = cnt;
}
int dijkstra1(int s, int t)
{
    for (int i = 1; i <= n; ++i) ans[i] = INT_MAX, vis[i] = false;
    ans[s] = 0;
    int pos = s;
    while (vis[pos] == false) {
        int minn = INT_MAX;
        vis[pos] = true;
        for (int i = head[pos]; i != 0; i = edge[i].next)
            if (vis[edge[i].to] == false && ans[edge[i].to] > ans[pos] + edge[i].val)
                ans[edge[i].to] = ans[pos] + edge[i].val;
        for (int i = 1; i <= n; ++i)
            if (ans[i] < minn && vis[i] == false)
                minn = ans[i], pos = i;
    }
    return ans[t];
}
int dijkstra2(int s, int t1, int t2)
{
    for (int i = 1; i <= n; ++i) ans[i] = INT_MAX, vis[i] = false;
    ans[s] = 0;
    int pos = s;
    while (vis[pos] == false) {
        int minn = INT_MAX;
        vis[pos] = true;
        for (int i = head[pos]; i != 0; i = edge[i].next)
            if (vis[edge[i].to] == false && ans[edge[i].to] > ans[pos] + edge[i].val)
                ans[edge[i].to] = ans[pos] + edge[i].val;
        for (int i = 1; i <= n; ++i)
            if (ans[i] < minn && vis[i] == false)
                minn = ans[i], pos = i;
    }
    return min(ans[t1], ans[t2]);
}
signed main()
{
	ios :: sync_with_stdio(false);
    cin.tie(NULL), cout.tie(NULL);
    cin >> m >> n >> s >> t1 >> t2;
    for (int i = 1; i <= m; ++i) {
        cin >> u >> v >> w;
        add(u, v, w), add(v, u, w);
    }
    cout << dijkstra1(t1, t2) + dijkstra2(s, t1, t2) << endl;
    return 0;
}

验证码wtfm

2023/4/1 19:48
加载中...