POJ 1545 / ZOJ 1333 Galactic Import (bfs || 最短路径)

被归在最短路径下面,其实完全可以用bfs解决,要说bfs也算是dijkstra的一种特殊情况吧。

 

这道题的最大的难度不是解决问题的过程,而是读题的过程,题意叙述可够难为人的,英文啊英文。。。

 

星球间运送货物(双向的),每个星球都有独特的资源。如果不能直接到达的话中间星球要收取费用5%,问运送到地球可以达到最大价值的是从哪个星球运送的,不要管那个星号“*”所描述的乱七八糟的东西,就是星球与地球有直接的连接。单终点最短路径转化为单源最短路径(当然若果你不用bfs的话)。

 

#include<iostream> #include<cstring> #include<queue> using namespace std; int main(void) { int n; char c; int k,t,e,mark; int i,j,from,to; int dist[27]; int mat[27][27]; double max,value[27]; queue<int> q; while( cin >> n ) { getchar(); for( i = 0; i <= 26; i++ ) for( j = 0; j <= 26; j++ ) mat[i][j] = 0; for( i = 0; i <= 26; i++ ) dist[i] = value[i] = 0; //以上为初始化 for( i = 1; i <= n; i++ ) { c = getchar(); from = c - 'A'; cin >> value[from]; getchar(); while( (c=getchar()) != '/n') { if( c == '*') to = 26; else to = c- 'A'; mat[from][to] = mat[to][from] = 1; } } //以上为图的输入过程 dist[26] = 1; q.push(26); while( !q.empty() ) { e = q.front(); q.pop(); for( j = 0; j < 26; j++) { k = mat[e][j]; if( k == 1 && dist[j] == 0) { dist[j] = dist[e] + 1; q.push(j); } } } //以上为bfs的过程 for( i = 0,max = -1; i < 26; i++ ) { if( dist[i] > 2 ) { t = dist[i] - 2; while( t--) value[i] *= 0.95; } else if( dist[i] != 2) value[i] = 0; if( value[i] > max ) max = value[mark = i]; } cout << "Import from " << (char)(mark+'A') << endl; } return 0; }

你可能感兴趣的:(POJ 1545 / ZOJ 1333 Galactic Import (bfs || 最短路径))