社区讨论

dijkstra模板题,WA了一个点

P3371【模板】单源最短路径(弱化版)参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lo31vqoc
此快照首次捕获于
2023/10/23 23:26
2 年前
此快照最后确认于
2023/10/23 23:26
2 年前
查看原帖
好像是不能到达的情况有问题
dalao求调
CPP
#include <iostream>
#include <cstring>
#include <cmath>

using namespace std;
const int N = 1000000;
int head[N];
int node[N];
int w[N];
int next_node[N];
int idx;
// head[]中下标代表对应的出发点 值代表对应的area下标
// area[]中下标代表简单的顺序 值代表去到此点
// next_area[]中和area[]共享下标,值是area指向的area对应的下标
// w权值也和node共享下标
void add(int a, int b, int c)
{
    node[idx] = b;
    next_node[idx] = head[a];
    head[a] = idx;
    w[idx] = c;
    idx++;
}

int ans;
int total_area;
int total_road;
bool state[N];
int start;
long long dist[N];

void DJX()
{
    dist[start] = 0;
    for (int i = 1; i <= total_area - 1; i++)
    {
        int t = -1;
        for (int j = 1; j <= total_area; j++)
        {
            if (state[j] == false && (t == -1 || dist[t] > dist[j]))
            {
                t = j;
            }
        }
        for (int j = head[t]; j != -1; j = next_node[j])
        {
            // j并不是真正的end_road,而是end_road的索引
            int end_road = node[j];
            dist[end_road] = min(dist[end_road], dist[t] + w[j]);
        }
        // 上述小循环通过fake起点更新其余点的dist
        state[t] = true;
    }

    // 最外层循环迭代一次确定一个点,共确定n次
}
int main()
{
    cin >> total_area >> total_road >> start;
    dist[start] = 0;
    memset(head, -1, sizeof(head));
    for (int i = 0; i <= total_area; i++)
    {
        dist[i] = 0x3f3f3f3f;
    }
    for (int i = 1; i <= total_road; i++)
    {
        int one, two, length;
        cin >> one >> two >> length;
        add(one, two, length);
    }
    DJX();
    for (int i = 1; i <= total_area; i++)
    {
        if (dist[i] == 0x3f3f3f3f)
        {
            cout << (pow(2, 32) - 1) << " ";
        }
        else
        {
            cout << dist[i] << " ";
        }
    }
    return 0;
}

回复

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

正在加载回复...