标签:计算 告诉 请求 总数 poj input put dijkstra 遍历
题目:
Input
Output
Sample Input
1 4 10000 3 2 2 8000 3 5000 1000 2 1 4 200 3000 2 1 4 200 50 2 0
Sample Output
5250
题意描述:
输入等级限制rl,和物品件数
输入每件物品及其替代品
解题思路:
最短路问题,求花费的最少金币,另外需要的是要所有交易的物品的等级不能超过等级限制。刚开始一位只要交易的前一位和后一位不超过等级限制就行了,WA了两次,尴尬。
具体思路是枚举每件物品的等级,当做最小等级,那么在此前提下,所有等级超过它等级限制rl的和小于此件物品等级的都不能交易。遍历所有物品等级,求出众多最短路的
最少金币即可。
代码实现:
1 #include<stdio.h> 2 #include<string.h> 3 struct N 4 { 5 int p,r; 6 }; 7 struct N w[110]; 8 int rl,n,e[110][110],book[110],dis[110]; 9 int Dijkstra(); 10 int inf=99999999; 11 int main() 12 { 13 int i,j,t,k,l,ans,temp; 14 while(scanf("%d%d",&rl,&n) != EOF) 15 { 16 for(i=1;i<=n;i++) 17 for(j=1;j<=n;j++) 18 e[i][j]=inf;//i==j时也初始化为inf 19 for(i=1;i<=n;i++) 20 { 21 scanf("%d%d%d",&w[i].p,&w[i].r,&t); 22 while(t--) 23 { 24 scanf("%d%d",&k,&l); 25 e[k][i]=l;//无向图 26 } 27 } 28 29 ans=inf; 30 for(i=1;i<=n;i++) 31 { 32 int ml =w[i].r; 33 for(j = 1; j <= n; j ++) 34 { 35 if(w[j].r - ml > rl || ml > w[j].r) 36 book[j]=1; 37 else 38 book[j]=0; 39 } 40 temp = Dijkstra(); 41 if(ans > temp) 42 ans=temp;//逻辑关系 43 } 44 printf("%d\n",ans); 45 } 46 return 0; 47 } 48 int Dijkstra() 49 { 50 int i,j; 51 for(i=1;i<=n;i++) 52 dis[i]=w[i].p; 53 for(i=1;i<=n;i++) 54 { 55 int min = inf, k = -1; 56 for(j = 1; j <= n; j++) 57 { 58 if(!book[j] && dis[j] < min) 59 {//执行的是两条语句,要加括号 60 min = dis[j]; 61 k = j; 62 } 63 } 64 book[k]=1; 65 for(j=1;j<=n;j++) 66 { 67 if(!book[j] && dis[j] > dis[k] + e[k][j]) 68 dis[j] = dis[k] + e[k][j]; 69 } 70 } 71 return dis[1]; 72 }
易错分析:
1、初始化地图时将i==j也初始化为无穷大,因为要求最少金币。
2、分清是无向图还是有向图,此题为无向图,因为交易是有方向的。
3、求最大或者最小时注意逻辑关系。
4、注意不要省括号,有时会更费时间去找错。
标签:计算 告诉 请求 总数 poj input put dijkstra 遍历
原文地址:http://www.cnblogs.com/wenzhixin/p/7329318.html