Dijkstra +并查集 wa41求调
查看原帖
Dijkstra +并查集 wa41求调
864319
Vegetablevird76楼主2024/4/5 12:52
#include<iostream>
#include<cstring>
#include<queue>
#define l first
#define r second
using namespace std;
const int N = 5e5 + 10;	
int h[N], ne[N], e[N], w[N], idx, a[N];
int dist[N];
bool st[N];
int p[N];
int n, m;
int x[N], y[N];
typedef pair<int, int>d;
typedef pair<d, int>pii;

void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++;	
}

int find(int x)
{
	if(p[x] != x)p[x] = find(p[x]);
	return p[x];
}

void jks()
{
//	memset(dist, 0x3f, sizeof dist);
//	dist[0] = 1;
	dist[n] = 1;
	priority_queue<pii, vector<pii>, less<pii>>heap;
	d t = {a[n], 1};
	heap.push({t, n});
	
	while(heap.size())
	{
		auto t = heap.top();
		heap.pop();
//		int distance = t.l;
		int no = t.r;
		
//		if(st[no])continue;
//		st[no] = 1;
		
		for(int i = h[no];i != -1;i = ne[i])
		{
			int j = e[i];
				if(dist[j] < dist[no] + 1)
				{
					dist[j] = dist[no] + 1;
					heap.push({{a[j], dist[j]}, j});
				}
		}
	}
}

int main()
{
	cin >> n >> m;
	memset(h, -1, sizeof h);
	for(int i = 1;i <= n;i++)cin >> a[i];
	
	for(int i = 1;i <= n;i++)p[i] = i;
	
	for(int i = 1;i <= m;i++)
	{
		cin >> x[i] >> y[i];
		if(a[x[i]] == a[y[i]])
		{
			if(find(x[i]) != find(y[i]))
			p[find(x[i])] = find(y[i]);
		}
	}
	for(int i = 1;i <= m;i++)
	{
		if(a[x[i]] < a[y[i]])add(find(y[i]), find(x[i]));
		if(a[x[i]] > a[y[i]])add(find(x[i]), find(y[i]));
	}
	
//	for(int i = 1;i <= n;i++)add(0, i, 0);
	jks();
//	for(int i = 1;i <= n;i++)cout << dist[i] << endl;
	cout << dist[1] << endl;
	return 0;
}
2024/4/5 12:52
加载中...