很久没刷PAT了,简单的dfs折腾了好久。
#include <string.h>
#include "stdio.h"
#include <iostream>
#include <map>
#include <vector>
using namespace std;
#define MAX 220
#define INF 999999999
typedef 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 ;
else
psize = 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 ;
}