zoj 1333 || poj 1545 Galactic Import(Dijkstra~)

看了半天,题目理解错误咧。。。看了人家的代码才理解。。。

 

这个题目是让求某个星球到地球(*)货物的最大值。。货物中转一次要减少5%。。开始理解成,经过一个星球,那个星球的货物也要运输到地球了。。。则求最小的中转次数即可。。。

 

哈,提交了两次,一不小心把党的两个号给挤下去啦,嘻嘻~~NO.2 NO.3~他貌似用的广搜。。。

 

#include <stdio.h> #include <memory.h> #include <stdlib.h> #define INT_MAX 0x3fffffff int main(void) { int hash[28],planet[28],map[28][28]; int n,i,j,k,x,now,tempi,earth; char from,aim; double len,temp,dis[28],max,value[28],min,sum; while( scanf("%d",&n)!=EOF ) { for(i=0; i<=26; i++) { for(j=0; j<=26; j++) map[i][j] = INT_MAX; map[i][i] = 0; } memset(planet,0,sizeof(planet)); getchar(); for(i=0; i<n; i++) { scanf("%c",&from); scanf("%lf",&len); getchar(); x = from - 'A'+1; planet[x] = 1; value[x] = len; aim = getchar(); do { if(aim == '*') { earth = x; map[x][0] = 1; map[0][x] = 1; } else { map[x][aim-'A'+1] = 1; map[aim-'A'+1][x] = 1; } aim = getchar(); }while(aim!= '/n'); } for(i=1; i<=26; i++) { dis[i]=map[0][i]; } memset(hash,0,sizeof(hash)); now = earth; hash[now] = 1; for(k=0; k<n; k++) //dijkstra { min = INT_MAX; for(i=1; i<=26; i++) if( planet[i] ) { if( dis[i] > dis[now] + map[now][i] ) dis[i] = dis[now] + map[now][i]; } for(i=1; i<=26; i++) if( planet[i] ) { if( dis[i] < min && !hash[i] ) { min = dis[i]; now = i; } } hash[now] = 1; } max =0; for(i=1; i<=26; i++) { if( planet[i] ) { sum = 0; temp = value[i]; for(j=1; j<dis[i]; j++) { sum += temp*0.05; temp*= 0.95; } sum = value[i] - sum; if( sum > max ) { max = sum; tempi = i; } } } printf("Import from %c/n",tempi+'A'-1); } system("pause"); return 0; }  

你可能感兴趣的:(zoj 1333 || poj 1545 Galactic Import(Dijkstra~))