1030. Travel Plan

来源:互联网 发布:卖鸽子的软件 编辑:程序博客网 时间:2024/06/07 10:52

使用dfs即可。

#include <cstdio>#include <vector>#include <cstring>using namespace std;#define MAX 550#define INF 99999999typedef struct D{int len ;int cost ;}D;D data[MAX][MAX];int visited[MAX];vector<int>ans ;int N , M ,S , E ;int shortest = INF ;int costest = INF ;void dfs( int start , int des , int len , int cost , vector<int>path){int i ; if( start == des ){if(len < shortest){shortest = len ;costest = cost ;ans.clear();ans = path ;}else if( len == shortest ){if(cost < costest ){costest = cost ;ans.clear() ;ans = path ;}}return ;}if( len > shortest ) return ;for( i = 0 ; i < N ; i ++){if( !visited[i] && data[start][i].len != INF){visited[i] = 1 ;path.push_back(i);dfs(i , des , len + data[start][i].len , cost + data[start][i].cost , path);visited[i] = 0 ;path.pop_back();}}return ;}int main(void){int  i  , j ;vector<int>tmpVector;scanf("%d %d %d %d" , &N ,&M ,&S , &E) ;memset(visited, 0 , sizeof(visited)) ;D simple ; simple.cost = INF ;simple.len = INF ;for( i =0  ; i < N ; i ++){for( j = 0 ; j < N ; j++){data[i][j] = data[j][i] = simple ; }}while(M--){D temp ;int s , d , l , c ;scanf("%d %d %d %d" , &s , &d , &l , &c);temp.len = l ;temp.cost = c ;data[s][d] = data[d][s] = temp ;}tmpVector.push_back(S) ;dfs( S , E, 0 , 0 , tmpVector) ;for( i = 0 ; i < ans.size();  i++){printf("%d " , ans[i]);}printf("%d %d\n" , shortest , costest);return 0 ;}


0 0