1087. All Roads Lead to Rome (30)

来源:互联网 发布:淘宝促销手段有哪些 编辑:程序博客网 时间:2024/05/22 00:36

    很久没刷PAT了,简单的dfs折腾了好久。

     

#include <string.h>#include "stdio.h"#include <iostream>#include <map>#include <vector>using namespace std;#define MAX 220#define INF 999999999typedef struct { int P[MAX][MAX]; int N ;}P ;int H[MAX];int visited[MAX] ;map<string ,int>pname ;string names[MAX] ;P p ; int minDst = INF  , maxHappy = -1  ;int numShort = 0 ;vector<int>points ;void dfs( int start , int happy , int dst , vector<int>tmp ){int i ;//剪枝if( dst > minDst) return ; //遍历结束的条件if(start == pname["ROM"]){if( dst < minDst){numShort = 1 ;minDst = dst ;maxHappy = happy ;points = tmp ;}else if( dst == minDst){numShort ++ ;if( happy > maxHappy){maxHappy = happy ;points = tmp ;}else if( happy == maxHappy){int psize = 0 ;if(points.size() == 0 ) psize = -1 ;elsepsize = points.size() ;if( happy/tmp.size() > maxHappy/psize){points = tmp ;}}}return ;    }for( i = 0 ; i < p.N ; i ++){if( !visited[i] && p.P[start][i] != INF){visited[i] = 1 ;tmp.push_back(i);dfs( i , happy + H[i] , dst + p.P[start][i] , tmp) ;visited[i] = 0 ;tmp.pop_back();}}}int main(void){int N , K  , i , j;string start ;vector<int>tmp ;//输入重定向 //freopen("input.txt" , "r"  , stdin); memset(visited , 0 , sizeof(visited));memset(H , 0 , sizeof(H));cin>>N>>K>>start ;pname[start] = 0 ;names[0] = start ;p.N = N ;for( i = 1 ; i < N ; i++){string name ;cin>> name >> H[i];pname[name] = i ;names[i] = name ;}for( i =0  ; i <N ; i ++ )for( j = 0 ;  j < N ; j ++)p.P[i][j] = INF;for( i = 0 ; i < K ; i ++){string nameA , nameB;int dis ;cin >> nameA >> nameB >> dis ;p.P[pname[nameA]][pname[nameB]]  = p.P[pname[nameB]][pname[nameA]] = dis ;}/*//打印所得数据for( i = 0 ; i < N ; i ++){for( j = 0 ; j < N ; j++){cout << names[i] << "\t" << names[j] << "\tdis: " << p.P[i][j] << endl;}} */visited[0] = 1 ;tmp.push_back(0);//通过dfs遍历查找dfs( 0 , 0 , 0 , tmp);cout << numShort << " " <<  minDst << " "  << maxHappy << " " << maxHappy/(points.size()- 1 )<< endl ;for( i = 0 ; i < points.size() - 1; i ++){cout << names[points[i]] << "->";}cout << names[points[i]] <<endl;return 0 ;}

0 0
原创粉丝点击