AcWing 903. 昂贵的聘礼
原题链接
中等
作者:
xiaoqi_
,
2021-03-10 14:53:27
,
所有人可见
,
阅读 259
题意分析:其实这题你如果画图的话,就知道怎么去进行建图了,无非是建立一个虚拟点,来构成一个完整的图。也就是求从虚拟原点到酋长之间的最短距离。之后又因为如果两人地位等级差距超过了M,就不能”间接交易”。所有在书写dijkstr的最后更新距离的时候,加上等级限制就ok了。可以借鉴一下这个题解: https://www.acwing.com/solution/content/12827/
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N =110,INF=0x3f3f3f3f;
int n,m;
int w[N][N],level[N];
int dist[N];
bool st[N];
//dijkstra求虚拟起点S到(在等级范围[down, up]内的)所有点最短距离
int dijkstra(int down,int up)
{
memset(dist,0x3f,sizeof dist);
memset(st,0,sizeof st);
dist[0]=0;
for(int i=1;i<=n+1;i++)
{
int t=-1;
for(int j=0;j<=n;j++) //从0开始,0为虚拟原点
if(!st[j]&&(t==-1||dist[t]>dist[j]))
t=j;
st[t]=true;
//只考虑等级范围内的最短距离
for(int j=1;j<=n;j++)
if(level[j]>=down&&level[j]<=up)
dist[j]=min(dist[j],dist[t]+w[t][j]);
}
return dist[1];
}
int main()
{
cin>>m>>n;
memset(w,0x3f,sizeof w);
for(int i=1;i<=n;i++) w[i][i]=0;
for(int i=1;i<=n;i++)
{
int price,cnt;
cin>>price>>level[i]>>cnt;
w[0][i]=min(price,w[0][i]);//防止重边
while(cnt--)
{
int id,cost;
cin>>id>>cost;
w[id][i]=min(w[id][i],cost); //防止重边
}
}
//女儿的等级为level[1],那么最低可以更女儿进行交换的就是leve[1] - m
//最高为女儿的等级level[1]
int res=INF;
for(int i=level[1]-m;i<=level[1];i++) res=min(res,dijkstra(i,i+m));
cout<<res<<endl;
return 0;
}