ZOJ 2526 FatMouse and JavaBean II (dijkstra + 权值记录)

fatmouse要找到从rm1到rm2的最短路径,但是这个路径不是唯一的。要从这些路径中找出javabean最多的,然后输出路径。

 

题目中最困难的是,找到所有路径,并找出符合题意的那个。。。

 

我的算法是先找出来一条最短路径,然后再这条路径上进行扩展,凡是符合这个条件的“dist[j] == dist[now] + mat[now][j]”,都可能作为最短路径的分支。可以求出到达每个点的的javabean记录下来,找到一个更长的就更新路径和javabean数量,最后递归输出路径。OVER!

 

#include<iostream> #include<cmath> using namespace std; const int INF = 99999999; const int MAX = 510; int n,m,start,end; int i,t,j,k,now; int mat[MAX][MAX],dist[MAX],flag[MAX]; int java[MAX],pre[MAX]; int javasum[MAX],pathsum[MAX]; int from,to,wei; void output(int end) { if( end == start ) { cout << start; return; } output(pre[end]); cout << ' ' << end; } int main(void) { int min; while( cin>>n>>m>>start>>end ) { for( i = 0; i < n; i++ ) cin >> java[i]; for( i = 0; i < m; i++ ) for( j = 0; j < m; j++ ) mat[i][j] = INF; for( i = 1; i <= m; i++ ) { cin >> from >> to >> wei; if( mat[from][to] > wei ) mat[from][to] = mat[to][from] = wei; }//以上建图部分 for( i = 1; i <= n; i++ ) { dist[i] = INF; flag[i] = 0; } dist[now=start] = 0; flag[now] = 1;pre[start] = -1; //dijkstra过程 for( i = 1; i < n; i++ ) { for( j = 0; j < n; j++ ) if( !flag[j] && dist[j] > dist[now] + mat[now][j] ) { dist[j] = dist[now] + mat[now][j]; pre[j] = now; } for( j = 0,min = INF; j < n; j++ ) if( !flag[j] && min > dist[j] ) min = dist[now = j]; flag[now] = 1; } for(i=1;i <= n; i++ ) flag[i] = pathsum[i] = javasum[i] = 0; dist[now=start] = 0; //在做一次dijkstra求路径 flag[now] = 1; pathsum[start] = 1; javasum[start] = java[start]; for( i = 1; i < n; i++ ) { for( j = 0; j < n; j++ ) if( !flag[j] && dist[j] == dist[now] + mat[now][j]) { pathsum[j] += pathsum[now]; t = javasum[now] + java[j]; if( t > javasum[j] ) { javasum[j] = t; pre[j] = now; } } for( j = 0,min = INF; j < n; j++ ) if( !flag[j] && min > dist[j]) min = dist[now=j]; flag[now] = 1; } cout << pathsum[end] << ' ' << javasum[end] << endl; output(end); //递归输出 cout << endl; } return 0; }

你可能感兴趣的:(ZOJ 2526 FatMouse and JavaBean II (dijkstra + 权值记录))