社区讨论
50分TLE求助
P1629邮递员送信参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lo7lbgq3
- 此快照首次捕获于
- 2023/10/27 03:41 2 年前
- 此快照最后确认于
- 2023/10/27 03:41 2 年前
代码如下,不知道是什么问题,求大佬帮忙看看
CPP#pragma warning(disable:4996)
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
#define N 1005
#define M 10005
struct edge {
int head[N];
int next[M];
int from[M];
int to[M];
int weight[M];
int tot = 0;
void add(int x, int y, int w) {
from[++tot] = x;
to[tot] = y;
next[tot] = head[x];
head[x] = tot;
weight[tot] = w;
}
}e_in, e_out;
int n, m;
int from[N], back[N];
bool vis1[N], vis2[N];
struct node {
int p;
int dis;
node(int _p, int _dis) {
p = _p;
dis = _dis;
}
bool operator< (const node& a)const {
return dis > a.dis;
}
};
void dijkstra(edge* e, int dis[], bool vis[]) {
priority_queue<node> q;
int cnt = n;
dis[1] = 0;
q.push(node(1, 0));
while (!q.empty() && cnt > 0) {
node p = q.top();
q.pop();
if (vis[p.p]) continue;
vis[p.p] = true;
--cnt;
for (int i = e->head[p.p]; i; i = e->next[i]) {
int k = e->to[i];
if (dis[k] > dis[p.p] + e->weight[i])
{
dis[k] = dis[p.p] + e->weight[i];
if (!vis[k])
q.push(node(k, dis[k]));
}
}
}
return;
}
int read() {
char c = getchar();
while (c < '0' || c>'9')
c = getchar();
int res = 0;
while (c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
return res;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; ++i) {
int x, y, w;
x = read();
y = read();
w = read();
e_out.add(x, y, w);
e_in.add(y, x, w);
}
memset(from, 0x7f, sizeof(from));
memset(back, 0x7f, sizeof(back));
dijkstra(&e_out, from, vis1);
dijkstra(&e_in, back, vis2);
int ans = 0;
for (int i = 1; i <= n; ++i) {
ans += from[i] + back[i];
}
cout << ans;
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...