社区讨论
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 条回复,欢迎继续交流。
正在加载回复...