社区讨论

TLE100分 , 求调

P3275[SCOI2011] 糖果参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo2qfxvh
此快照首次捕获于
2023/10/23 18:06
2 年前
此快照最后确认于
2023/10/23 18:06
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pll;
const int N = 1e5 + 10, M = 3 * N;
int n, m;
int h[N], e[M], ne[M], w[M], idx;
int dist[N], cnt[N];
bool st[N];
void add(int a, int b, int c) {
	e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
}

//栈优化SPFA
bool spfa()
{
	deque<int> q;
	q.push_back(0);
	memset(dist,-0x3f,sizeof dist);
	dist[0] = 0;
	st[0] = true;
	
	while(q.size())
	{
		int t = q.back();
		q.pop_back();
		st[t] = false;
		if (cnt[t] >= n + 1) return true;
		
		for (int i = h[t]; i!=-1; i = ne[i])
		{
			int j = e[i];
			if (dist[j] < dist[t] + w[i])
			{
				dist[j] = dist[t] + w[i];			
				if (!st[j])
				{
					q.push_back(j);
					cnt[j] ++;
					st[j] = true;
				}
			}
		}
	}
	return false;
}

int main() {
	cin >> n >> m;
	memset(h, -1, sizeof h);
	while (m -- ) {
		int x, a, b;
		cin >> x >> a >> b;
		if (x == 1) add(b, a, 0), add(a, b, 0);
		else if (x == 2) add(a, b, 1);
		else if (x == 3) add(b, a, 0);
		else if (x == 4) add(b, a, 1);
		else add(a, b, 0);
	}
	for (int i = 1; i <= n; i ++ ) add(0, i, 1);
	
	if (spfa()) cout << "-1" << endl;
	else {
		ll res = 0;
		for (int i = 1; i <= n; i ++ ) res += dist[i];
		cout << res << endl;
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...