魔幻的RE
查看原帖
魔幻的RE
785181
sunjishuo楼主2023/10/14 20:33
#include <bits/stdc++.h>
using namespace std;
typedef pair <int, int> PII;
const int N = 1E6 + 10, M = 2e6 + 10;

int head[N], rhead[N], ver[M * 2], nxt[M * 2], edge[M * 2], tot;
int n, m;
int s, t;
int fa[N];

int get(int x)
{
	if (x == fa[x]) return x;
	return fa[x] = get(fa[x]);
}

void add(int *h, int x, int y)
{
	ver[++ tot] = y;
	edge[tot] = 1;
	nxt[tot] = h[x];
	h[x] = tot;
}
int q1[N];
bool st[N];
void bfs1(int s)
{
	int hh = 0, tt = -1;
	q1[++ tt] = s;
	while(hh <= tt)
	{
		int x = q1[hh ++];
		if (st[x]) continue;
		else st[x] = true;
		for (int i = rhead[x]; i; i = nxt[i])
		{
			int y = ver[i];
			int a = get(x), b = get(y);
			fa[a] = b;
			q1[++ tt] = y;
		}		
	}

}

int dist[N];
bool v[N];
priority_queue <PII, vector<PII>, greater<PII> > q;
void dijkstra(int s, int t)
{
	memset (dist, 0x3f, sizeof dist);
	q.push({0, s});
	dist[s] = 0;
	
	while(q.size())
	{
		int x = q.top().second;
		q.pop();
		if (v[x]) continue;
		v[x] = true;
		for (int i = head[x]; i; i = nxt[i])
		{
			int y = ver[i], z = edge[i];
			bool flag = true;

			for (int j = head[y]; j; j = nxt[j])
				if (fa[ver[j]] != fa[t]) flag = false;				

			if (dist[y] > dist[x] + edge[i] && flag)
			{
				dist[y] = dist[x] + edge[i];
				q.push({dist[y], y});
			}
		}
	 } 
	if (dist[t] == 0x3f3f3f3f) puts("-1");
	else cout << dist[t] << endl;
}

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= m; i ++ )
	{
		int x, y;
		cin >> x >> y;
		add(head, x, y);
		add(rhead, y, x);
	}
	cin >> s >> t;
	for (int i = 1; i <= n; i ++ ) fa[i] = i;
	bfs1(t);
	for (int i = 1; i <= n; i ++ ) get(i);
	dijkstra(s, t);
	
	return 0;
}

这个是可以AC的代码, 但是如果我们把const int N = 1E6 + 10的6改为5,那么就会RE第二个数据,可是我看数据范围应该没问题才对

2023/10/14 20:33
加载中...