[ABC164E] Two Currencies 题解
本题解未建图、未跑最短路,使用乱搞大法,码量大概是目前题解区最少的吧。
题意简述
有
解题思路
考虑 dp。设
其中
然后考虑把上面两个东西转移个
代码示例
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,s,u[10010],v[10010],x[10010],t[10010];
int c[10010],d[10010],dp[55][2510];
signed main(){
memset(dp,0x3f,sizeof(dp));
cin>>n>>m>>s;
for(int i=1;i<=m;i++) cin>>u[i]>>v[i]>>x[i]>>t[i];
for(int i=1;i<=n;i++) cin>>c[i]>>d[i];
s=min(s,2500ll);//银币太多是无用的
dp[1][s]=0;//初始化
for(int _=0;_<=100;_++){//转移100次
for(int i=1;i<=n;i++){
for(int j=c[i];j<=2500;j++) dp[i][j]=min(dp[i][j],dp[i][j-c[i]]+d[i]);
}//兑换银币的转移
for(int i=1;i<=m;i++){
for(int j=x[i];j<=2500;j++){
dp[u[i]][j-x[i]]=min(dp[u[i]][j-x[i]],dp[v[i]][j]+t[i]);
dp[v[i]][j-x[i]]=min(dp[v[i]][j-x[i]],dp[u[i]][j]+t[i]);
}
}//城市的转移,这个和bellman-ford几乎一样
}
for(int i=2;i<=n;i++){
int ans=0x3f3f3f3f3f3f3f3f;
for(int j=0;j<=2500;j++) ans=min(ans,dp[i][j]);
cout<<ans<<endl;
}
return 0;
}