求助spfa ac81 tle14
查看原帖
求助spfa ac81 tle14
670012
kinuru楼主2024/4/1 23:19
#include<bits/stdc++.h>
#define rep(i, a, b) for(int i = a; i <= b; i ++)
#define per(i, a, b) for(int i = a; i >= b; i --)
#define vi vector<int>
#define fi first
#define se second
#define int long long
#define endl '\n'
#define ull unsigned long long
#define ls(u) u << 1
#define rs(u) u << 1 | 1
#define sz(v) ((int) v.size())
using namespace std;
typedef long long ll;

const int N = 2e5 + 10;
int n, m, inf = 1e6;
int a[N], dist[N];
int st[N];
vector<pair<int, int>> edges[N];

void spfa(){
	memset(dist, -0x3f, sizeof dist);
	dist[1] = 1, st[1] = 1;

	queue<pair<int, int>>q;
	q.push({1, 1});

	while(!q.empty()){
		auto t = q.front();
		q.pop();

		int ver = t.se;
		st[ver] = 0;

		for(auto v : edges[ver]){
			if(dist[v.se] < dist[ver] + v.fi){
				dist[v.se] = dist[ver] + v.fi;
				if(!st[v.se]){
					q.push({dist[v.se], v.se});
					st[v.se] = 1;
				}
			}
		}
	}
	return ;
}

void solve(){
    cin >> n >> m;
    rep(i, 1, n) cin >> a[i];
    rep(i, 1, m){
    	int u, v; cin >> u >> v;
    	if(a[u] == a[v]){
    		edges[u].push_back({0, v});
    		edges[v].push_back({0, u});
    	}else{
    		int mn = a[u] < a[v] ? u : v, mx = a[u] > a[v] ? u : v;
    		edges[mn].push_back({1, mx});
    	}
    }
    spfa();
    cout << max((int)0, dist[n]) << endl;
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	int T; T = 1; 
	// cin >> T;
	while(T --){
		solve();
	}

	return 0;
}
2024/4/1 23:19
加载中...