本文主要是介绍昂贵的聘礼 POJ - 1062 (限制型最短路),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
为了方便起见,我们把所有的物品从1开始进行编号,酋长的允诺也看作一个物品,并且编号总是1。每个物品都有对应的价格P,主人的地位等级L,以及一系列的替代品Ti和该替代品所对应的"优惠"Vi。如果两人地位等级差距超过了M,就不能"间接交易"。你必须根据这些数据来计算出探险家最少需要多少金币才能娶到酋长的女儿。
1 4 10000 3 2 2 8000 3 5000 1000 2 1 4 200 3000 2 1 4 200 50 2 0
5250
这个题目中有两个限制因素,一个是等级,一个是最短路径(最少钱),首先一点,如果等级解决不了,是没法求最短路的,其实这种题蛮多的,因此我们只要先确定等级,在逐步求最短路,一般的思路就是枚举等级,每个等级下那些不符合等级要求的,直接从vis【】数组里抹去,多次求解取最大。
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
#include <map>
#include <climits>
#include <stdio.h>
#include <queue>using namespace std;struct node{int x,t;node(int x,int t){this->x=x;this->t=t;}bool operator < (const node a)const{return t > a.t;}
};
int n,m;
int ans;
int vis[110];
int dis[110];
int mp[110][110];
int mp1[110][110];
void dijsktra()
{memset(dis,0,sizeof(dis));priority_queue <node> pq;node tmp(0,0);pq.push(tmp);while(!pq.empty()){tmp = pq.top();pq.pop();if(vis[tmp.x]) continue;vis[tmp.x] = 1;for(int i = 0; i <= n; i++){if(vis[i] || !mp[tmp.x][i]) continue;int t = tmp.t + mp[tmp.x][i];dis[i] = dis[i]==0 ? t : min(t,dis[i]);node nd(i,dis[i]);pq.push(nd);}}if(dis[1] != 0)ans = min(ans,dis[1]);
}
int Rank[110];
int main()
{while(scanf("%d%d",&m,&n)!=EOF){ans = INT_MAX;int rank_min = INT_MAX;int rank_max = -1;memset(mp,0,sizeof(mp));memset(mp1,0,sizeof(mp1));for(int i = 1; i <= n; i++){int pr,rak,num;scanf("%d%d%d",&pr,&Rank[i],&num);mp[0][i] = pr;if(Rank[i] > rank_max) rank_max = Rank[i];if(Rank[i] < rank_min) rank_min = Rank[i];for(int j = 1; j <= num ;j++){int T,V;scanf("%d%d",&T,&V);mp[T][i] = V;}}for( Rank[0] = rank_min;Rank[0] <= rank_max;Rank[0]++){memset(vis,0,sizeof(vis));for(int i = 0; i <= n; i++)if(Rank[i] < Rank[0] || Rank[i] - Rank[0] > m) vis[i] = 1;dijsktra();}if(ans == INT_MAX) printf("0\n");elseprintf("%d\n",ans);}return 0;
}
这篇关于昂贵的聘礼 POJ - 1062 (限制型最短路)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!