标签:
poj 1062
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 39437 | Accepted: 11432 |
Description
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
对于从u点出发到w点的路径中,他会跟很多等级的人交易,然而必须满足在路径中的点等级差不很超过一个M值,那么怎么对这样的问题求解呢?我没看报告前是很疑惑的!
假设如果给这条路径加上一个附加条件的话,情况可能就有所变化了,要求最短路中的所有点的等级在一个区间内[a,b],如果能够很好的给出这个区间的话,只要对图中的点进行上筛选即可了。
这个区间的确定显然不是随便的,那么就要根据一定的条件了,从题意中我们知道,最后所有的最短路都会汇集在1号点,也就是说1号点是所有最短路都存在的点,好了,这个条件很重要,这样我们就可以依照1号点来给定区间了,比如1号点等级为lev,那么也就是说在所有最短路的这些点都必须满足在[lev-M,lev+M]这个区间里面。好了,可能你会迫不及待将这个区间作为最后的区间,在想想,如果在这个区间内出现的两个点的他们之间的等级差超过了M值(这是存在的),显然,不符合题意了,所以这个区间还有继续缩小。其实只要稍微动动脑子,就可以找出这样的区间[lev-M,lev],[lev-M+1,lev+1],... ...,[lev,lev+M],首先这些区间都满足大区间的条件,而且如果将这些区间的某个作为筛选条件的话,在这个区间内的任意两个点的等级都不会超过M值,这就是很特别的地方了(转)
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 const int INF=99999999; 5 int maps[105][105],v[105],d[105],N; 6 int l[105],p[105],in[105]; 7 8 int Dijkstra() 9 { 10 memset(v,0,sizeof(v)); 11 int i,j,k,mini; 12 13 for(i=1;i<=N;i++) 14 d[i]=INF; 15 d[1]=0; 16 for(i=1;i<=N;i++) 17 { 18 mini=INF;k=-1; 19 for(j=1;j<=N;j++) 20 { 21 if(!v[j] && in[j] && d[j]<mini) 22 mini=d[k=j]; 23 } 24 if(mini==INF) 25 break; 26 27 v[k]=1; 28 for(j=1;j<=N;j++) 29 { 30 if(!v[j] && in[j] && d[k]+maps[k][j]<d[j]) 31 { 32 d[j]=d[k]+maps[k][j]; 33 } 34 } 35 } 36 mini=INF; 37 for(i=1;i<=N;i++) 38 { 39 if(d[i]+p[i]<mini && v[i]) 40 mini=d[i]+p[i]; 41 } 42 return mini; 43 } 44 45 int main() 46 { 47 int m,x,T,V; 48 int i,j,minicost; 49 while(scanf("%d %d",&m,&N)!=EOF) 50 { 51 52 for(i=1;i<=N;i++) 53 { 54 for(j=1;j<=N;j++) 55 { 56 maps[i][j]=( i==j ? 0 :INF); 57 } 58 } 59 for(i=1;i<=N;i++) 60 { 61 scanf("%d %d %d",&p[i],&l[i],&x); 62 for(j=1;j<=x;j++) 63 { 64 scanf("%d %d",&T,&V); 65 if(maps[i][T]>V) 66 { 67 maps[i][T]=V; 68 } 69 } 70 } 71 int lev=l[1],coc; 72 minicost=INF; 73 for(i=0;i<=m;i++) 74 { 75 memset(in,0,sizeof(in)); 76 for(j=1;j<=N;j++) 77 { 78 if(l[1]-m+i<=l[j] && l[j]<=l[1]+i) 79 in[j]=1; 80 } 81 coc=Dijkstra(); 82 if(coc<minicost) 83 minicost=coc; 84 } 85 printf("%d\n",minicost); 86 } 87 return 0; 88 }
标签:
原文地址:http://www.cnblogs.com/cyd308/p/4474198.html