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