标签:903 head int cnt bian vis 聘礼 AcWing dis
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。