题解
2026-06-09 20:40:21
发布于:浙江
44阅读
0回复
0点赞
首发题解,庆祝一下
大家好,我是энтджей,今天是我2026年第十八次正式发题解!
能不能点个赞
首先简化题意:
- 共有 种商品,第 种商品的价格为 ,现在有 种交换方式,第 种交换方式为 将序号为 的商品换为序号为 的商品,并且你会获得(或失去) 元钱。你现在手上有商品 ,你希望通过交易,用最少得钱,将 交换为 。
然后就是写代码:
-
处理输入(read):
- 正常输入
-
核心部分(process):
- 可以直接广搜,然后输出
- 但是如果直接广搜,广搜 手上是什么序号的上商品,花了多少钱,这样会超时(好像,反正不能A)
- 那么只能优化:
- 注意到将 换成 ,假设换了 次后,手上的商品为 ,其中,换了 ,次后手上的商品为 ,则总花费为:
- 所以实际的花费只和 、 和 交换次数 有关
- 注意到将 换成 ,假设换了 次后,手上的商品为 ,其中,换了 ,次后手上的商品为 ,则总花费为:
最后输出(write):
- 输出结果
完整代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n, m, a, b;
int v[N];
vector<int> ve[N];
bool vis[N];
void read() {
cin >> n >> m >> a >> b;
for(int i = 0; i < n; i++) {
cin >> v[i];
}
for(int i = 1; i <= m; i++) {
int x, y;
cin >> x >> y;
ve[x].push_back(y);
}
}
void ProcessWrite() {
queue<int> q;
q.push(a);
vis[a] = true;
int cnt = 0; // cnt = 当前BFS层数 = 已进行的交换次数
while(!q.empty()) {
for(int i = q.size(); i >= 1; i--) {
int u = q.front();
q.pop();
if(u == b) {
cout << v[b] - v[a] + cnt;
return ;
}
for( auto t : ve[u] ) {
if(!vis[t]) {
q.push(t);
vis[t] = true;
}
}
}
cnt++;
}
cout << "No solution";
return ;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
read();
ProcessWrite();
return 0;
}
🎉完结撒花🎉
全部评论 1
#include<bits/stdc++.h> using namespace std; int n,m,a,b,v[100010]; vector<int> ve[100010]; void bfs(){ queue<int> q; bool vis[100010]={0}; v[a]=1; q.push(a); int sum=0; while(q.size()){ for(int i=q.size();i>=1;i--){ int u=q.front(); q.pop(); if(u==b){ cout<<v[b]-v[a]+sum; return ; } for(auto i:ve[u]){ if(!vis[i]){ q.push(i); vis[i]=1; } } } sum++; } cout<<"No solution"; return ; } int main(){ cin>>n>>m>>a>>b; for(int i=0;i<n;i++){ cin>>v[i]; } for(int i=1;i<=m;i++){ int x,y; cin>>x>>y; ve[x].push_back(y); } bfs(); }我的为什么不对啊
5天前 来自 广东
0?
5天前 来自 浙江
016分钟前 凉透了
5天前 来自 浙江
0









有帮助,赞一个