数据中发现有0?
查看原帖
数据中发现有0?
795258
SmileKat46楼主2022/11/18 00:01
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

struct node {
	ll d;
	int id;
	int s;
	bool operator<(const node& a) const {
		return d < a.d;
	}
};

int main() {
	int T;
	cin >> T;
	while (T--) {
		int n, m, k;
		cin >> n >> m >> k;
		vector<vector<int>> G(n), c(n);
		for (int i = 0; i < m; ++i) {
			int u, v, w;
			cin >> u >> v >> w;
			--u;
			--v;
			if (u == v)
				continue;
			if (u == -1 || v == -1) // 去掉这行和下一行就会RE
				continue;
			G[u].push_back(v);
			c[u].push_back(w);
		}
		vector<bool> a(n, false);
		vector<pair<ll, int>> d1(n, make_pair(1000000000000000000, -1)), d2(n, make_pair(1000000000000000000, -2));
		set<node> s;
		for (int i = 0; i < k; ++i) {
			int v;
			cin >> v;
			--v;
			a[v] = true;
			d1[v] = make_pair(0, v);
			s.insert((node) { 0, v, v });
		}
		while (!s.empty()) {
			node p = *(s.begin());
			ll cd = p.d;
			int v = p.id;
			if (a[v] && cd == d2[v].first) {
				cout << d2[v].first << endl;
				break;
			}
			s.erase(p);
			for (int i = 0; i < G[v].size(); ++i) {
				if (d1[G[v][i]].first > cd + c[v][i]) {
					if (d1[G[v][i]].second == p.s) {
						s.erase((node) {d1[G[v][i]].first, G[v][i], d1[G[v][i]].second});
						d1[G[v][i]] = make_pair(cd + c[v][i], p.s);
						s.insert((node) {cd + c[v][i], G[v][i], p.s});
					}
					else {
						s.erase((node) {d2[G[v][i]].first, G[v][i], d2[G[v][i]].second});
						d2[G[v][i]] = d1[G[v][i]];
						d1[G[v][i]] = make_pair(cd + c[v][i], p.s);
						s.insert((node) {cd + c[v][i], G[v][i], p.s});
					}
				}
				else if (d1[G[v][i]].second != p.s && d2[G[v][i]].first > cd + c[v][i]) {
					s.erase((node) {d2[G[v][i]].first, G[v][i], d2[G[v][i]].second});
					d2[G[v][i]] = make_pair(cd + c[v][i], p.s);
					s.insert((node) {cd + c[v][i], G[v][i], p.s});
				}
			}
		}
	}
	return 0;
}

1~10WA,11AC,但是把注释处删掉会RE两个点,也就是说数据中有 u=0u=0v=0v=0(代码中 u,vu,v 即题目中 x,yx,y)?

2022/11/18 00:01
加载中...