AcWing 903. 昂贵的聘礼
作者:互联网
y总做法:建立一个虚拟原点,到所有物品的距离为物品原本价值,物品之间的价值为交易价值,枚举等级范围跑最短路即可
我的做法:以女儿为原点反向建图,物品之间的距离为交易价值,到每个物品的最短路加上这个物品的原本价值即为总花费,取最小
时间复杂度均为O(n^2*logn)(dij堆优化)
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N = 110,M = 1e4+10,INF = 0x3f3f3f3f;
int d,n;
int w[N],r[N];
int head[N],cnt,dis[N],vis[N];
struct BIAN{
int to,next;
int len;
}bian[M*2];
void add(int x,int y,int z){
bian[++cnt].to=y;
bian[cnt].len=z;
bian[cnt].next=head[x];
head[x]=cnt;
}
priority_queue<PII,vector<PII>,greater<PII> > q;
void dij(int s,int low,int up){
memset(dis,0x3f,sizeof dis);
memset(vis,0,sizeof vis);
q.push({0,s});
dis[s]=0;
int x,y;
while(!q.empty()){
x=q.top().second;
q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=head[x];i!=-1;i=bian[i].next){
y=bian[i].to;
if(r[y]<low || r[y]>up) continue;
if(dis[y]>dis[x]+bian[i].len){
dis[y]=dis[x]+bian[i].len;
q.push({dis[y],y});
}
}
}
}
int main(){
memset(head,-1,sizeof head);
cin>>d>>n;
int k;
for(int i=1;i<=n;i++){
cin>>w[i]>>r[i]>>k;
for(int j=1;j<=k;j++){
int y,z;
cin>>y>>z;
add(i,y,z);
}
}
int res=INF;
for(int i=r[1]-d;i<=r[1];i++){
dij(1,i,i+d);
for(int j=1;j<=n;j++){
if(dis[j]!=INF)
res=min(res,dis[j]+w[j]);
}
}
cout<<res;
return 0;
}
标签:903,head,int,cnt,bian,vis,聘礼,AcWing,dis 来源: https://www.cnblogs.com/xhy666/p/16298961.html