首页 > 代码库 > poj1062(昂贵的聘礼)
poj1062(昂贵的聘礼)
题目大意:
中文题目不用翻译。
说下通俗的题意:M代表等级的权限限制,N代表有N个地方,其中酋长地方的编号永远是第一个编号,所以输入的第一组数据就是酋长的允诺编号为1. 接着有X行能与此地方交换物品和拥有替代品之后的价格。其中P代表这个地方的价值,L代表这个地方的等级。问你怎么用自己的聪明才智使得到达编号1 这个地方的花费最少。
测试实例的走法: 4->2->1 一共花费5250.
解题思路:
建图,dijstra最短路。
注意:
代码:
1 #include <algorithm> 2 #include <iostream> 3 #include <sstream> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cstdio> 7 #include <string> 8 #include <bitset> 9 #include <vector> 10 #include <queue> 11 #include <stack> 12 #include <cmath> 13 #include <list> 14 //#include <map> 15 #include <set> 16 using namespace std; 17 /***************************************/ 18 #define ll long long 19 #define int64 __int64 20 /***************************************/ 21 const int INF = 0x7f7f7f7f; 22 const double eps = 1e-8; 23 const double PIE=acos(-1.0); 24 const int d1x[]= {0,-1,0,1}; 25 const int d1y[]= {-1,0,1,0}; 26 const int d2x[]= {0,-1,0,1}; 27 const int d2y[]= {1,0,-1,0}; 28 const int fx[]= {-1,-1,-1,0,0,1,1,1}; 29 const int fy[]= {-1,0,1,-1,1,-1,0,1}; 30 /***************************************/ 31 void openfile() 32 { 33 freopen("data.in","rb",stdin); 34 freopen("data.out","wb",stdout); 35 } 36 /**********************华丽丽的分割线,以上为模板部分*****************/ 37 int lowcost[100],level[100]; //到此地方的最少花费、此地方的等级 38 int vis[100]; 39 int map[100][100]; 40 int min1; 41 void dijstra(int m,int n) 42 { 43 int i,j,k; 44 int min; 45 min1=INF; 46 for(int lev=level[1]-m; lev<=level[1]; lev++) //枚举等级区间 47 { 48 for(i=1; i<=n; i++) 49 { 50 lowcost[i]=map[0][i]; 51 vis[i]=0; 52 } 53 int sum=0; 54 for (j=1; j<=n; j++) 55 if (level[j]<lev||level[j]>lev+m) //把不再此等级范围内的地方标记 56 { 57 vis[j]=1; 58 sum++; 59 } 60 for(i=1; i<=n-1-sum; i++) 61 { 62 j=0; 63 min=INF; 64 for(k=1; k<=n; k++) 65 { 66 if (!vis[k]&&lowcost[k]<min) 67 { 68 min=lowcost[k]; 69 j=k; 70 } 71 } 72 vis[j]=1; 73 for(k=1; k<=n; k++) 74 if (!vis[k]&&(map[j][k]+lowcost[j]<lowcost[k])) 75 lowcost[k]=map[j][k]+lowcost[j]; 76 } 77 if (lowcost[1]<min1) 78 min1=lowcost[1]; 79 } 80 } 81 int main() 82 { 83 int m,n; 84 while(scanf("%d%d",&m,&n)!=EOF) 85 { 86 int i,j; 87 for(i=0; i<=n; i++) 88 for(j=0; j<=n; j++) 89 map[i][j]=INF; 90 for(i=1; i<=n; i++) 91 { 92 int a,b,c; 93 scanf("%d%d%d",&a,&b,&c); 94 level[i]=b; 95 map[0][i]=a; 96 for(j=0; j<c; j++) 97 { 98 int x,val; 99 scanf("%d%d",&x,&val); 100 if (map[i][x]>val) //有向图 101 { 102 // map[i][x]=val; 103 map[x][i]=val; 104 } 105 } 106 } 107 dijstra(m,n); 108 printf("%d\n",min1); 109 } 110 return 0; 111 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。