社区讨论

dijstra 蒟蒻求助!aaa

P1342[CERC1998] 请柬参与者 5已保存回复 13

讨论操作

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

当前回复
11 条
当前快照
1 份
快照标识符
@lqaoswzi
此快照首次捕获于
2023/12/18 17:01
2 年前
此快照最后确认于
2023/12/18 20:43
2 年前
查看原帖
样例对了,判定只对一个点qwq
邻接表做的dijstra
蒟蒻已经找不出来错误了qwq

蒟蒻的代码:

CPP
#include <cstring>
#include <iostream>
#define INF 0x3f3f3f3f
#define N 1000010
using namespace std;
int d[N];
int n, m, cnt, cnt1;
int head[N], nxt[N], to[N], len[N];
int head1[N], nxt1[N], to1[N], len1[N];

inline int read()
{
    int f = 1, x = 0;
    char c = getchar();
    while (c < '0' || c > '9')
    {
        if (c == '-')
            f = -f;
        c = getchar();
    }
    while (c >= '0' && c <= '9')
        x = x * 10 + c - '0', c = getchar();
    return f * x;
}

void add(int u, int v, int l)
{
    nxt[++cnt] = head[u];
    head[u] = cnt;
    to[cnt] = v;
    len[cnt] = l;
}
void add_1(int u, int v, int l)
{
    nxt1[++cnt1] = head1[u];
    head1[u] = cnt1;
    to1[cnt1] = v;
    len1[cnt1] = l;
}
void dij()
{
    for (int i = 1; i <= n; i++)
        d[i] = INF;
    d[1] = 0;
    bool f[N] = {0};
    for (int i = 1; i <= n; i++)
    {
        int mi = -1;
        for (int j = 1; j <= n; j++)
        {
            if (!f[j] && (mi == -1 || d[j] < d[mi]))
            {
                mi = j;
            }
        }
        f[mi] = true;
        for (int j = head[mi]; j; j = nxt[j])
        {
            int t = to[j];
            if (!f[t] && (d[mi] + len[j] < d[t]))
            {
                d[t] = d[mi] + len[j];
            }
        }
    }
}
void dij1()
{
    for (int i = 1; i <= n; i++)
        d[i] = INF;
    d[1] = 0;
    bool f[N] = {0};
    for (int i = 1; i <= n; i++)
    {
        int mi = -1;
        for (int j = 1; j <= n; j++)
        {
            if (!f[j] && (mi == -1 || d[j] < d[mi]))
            {
                mi = j;
            }
        }
        f[mi] = true;
        for (int j = head1[mi]; j; j = nxt1[j])
        {
            int t = to1[j];
            if (!f[t] && (d[mi] + len1[j] < d[t]))
            {
                d[t] = d[mi] + len1[j];
            }
        }
    }
}
int main()
{
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= m; i++)
    {
        int u, v, l;
        u = read();
        v = read();
        l = read();
        // scanf("%d %d %d", &u, &v, &l);
        add(u, v, l);
        add_1(v, u, l);
    }
    dij();
    int ans = 0;
    for (int i = 1; i <= n; i++)
    {
        if (d[i] != INF)
            ans += d[i];
    }

    dij1();

    for (int i = 1; i <= n; i++)
    {
        if (d[i] != INF)
            ans += d[i];
    }

    printf("%d\n", ans);
    return 0;
}

求帮助qwq!!

(大佬留步o((>ω< ))!帮我看看吧)

回复

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

正在加载回复...