作业介绍

商品

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5+5;
int n, m, a, b, v[N], dist[N], f[N];
typedef pair<int, int> PII;
priority_queue<PII, vector<PII>, greater<PII>> q;
vector<int> s[N];

void dj(){
	dist[a] = 0;   //起点到起点的距离是0
	q.push({0, a});   //加入队列{距离,点}
	f[a] = 1;    //a这个点入队
	while(q.size()){  //只要队列不为空
		PII t = q.top();   //优先队列队首是top
		q.pop();
		int x = t.second;
//		f[x] = 0;
		//尝试更新从最短标记x点出发所能到的所有点
		for(int y : s[x]){   //遍历x所能走到的所有的点
			if(dist[y] > dist[x] + 1){  //如果从x出发到y更短,那么就更新距离
				dist[y] = dist[x] + 1;
				if(f[y]) continue;
				f[y] = 1;
				q.push({dist[y], y});
			}
		}
	}
}
int main(){
	memset(dist, 0x3f, sizeof dist);
	cin >> n >> m >> a >> b;
	for(int i=0; i<n; i++) cin >> v[i];  //输入每个物品的价值
	for(int i=1; i<=m; i++){   //m个商人
		int x, y;    
		cin >> x >> y;    //在第i个商人这儿,可以用x交换y
		s[x].push_back(y);   //x->y的有向图
	}
	dj();    //求出从起点商品a交换到每一种商品的路径长度
	if(dist[b] == 0x3f3f3f3f) cout << "No solution";
	else cout << v[b] - v[a] + dist[b];
	
	return 0;
}
状态
已结束
题目
3
开始时间
2025-1-17 0:00
截止时间
2025-1-25 23:59
可延期
24 小时