为什么差分约束都能死循环
  • 板块CF22D Segments
  • 楼主Vitamin_B
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/20 14:58
  • 上次更新2024/6/20 19:32:44
查看原帖
为什么差分约束都能死循环
743373
Vitamin_B楼主2024/6/20 14:58

rt,样例二SPFA死循环了??貌似也没有正环啊。。

# pragma GCC optimize("Ofast,no-stack-protector")

# pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

# include <bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef pair <int, int> pii;

int n, m, x, y, z, dis[30005];

vector <pii> v[30005];

bitset <30005> vis;

queue <int> q;

int main () {
//	freopen ("sample.in", "r", stdin);
	ios::sync_with_stdio (0);

	cin.tie (0);

	cout.tie (0);

	cin >> m;

	while (m --) {

		cin >> x >> y;

		v[x].push_back ({y + 1, 1});

		n = max (n, y + 1);

	}

	for (int i = 0; i < n; ++ i)
		v[i].push_back ({i + 1, 0}), v[i + 1].push_back ({i, -1});

	fill (dis + 1, dis + 1 + n, -1e18);

	q.push (0);
//	for (int i = 0; i <= n; ++ i) for (pii& j : v[i]) cerr << i << "->" << j.first << ':' << j.second << '\n';
	while (! q.empty ()) {

		x = q.front ();

		q.pop ();
//		cerr << x << ':' << dis[x] << '\n';
		vis[x] = 0;

		for (pii& i : v[x])
			if (i.second + dis[x] > dis[i.first]) {

				dis[i.first] = dis[x] + i.second;

				if (! vis[i.first])
					q.push (i.first), vis[i.first] = 1;

			}

	}
//	for (int i = 1; i < n; ++ i) if (dis[i]) cerr << i << '\n';
	cout << dis[n] << '\n';

	for (int i = 0; i < n; ++ i)
		if (dis[i + 1] > dis[i])
			cout << i << ' ';

	return 0;

}

顺便捞

2024/6/20 14:58
加载中...