社区讨论

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 条回复,欢迎继续交流。

正在加载回复...