3880
社区成员
#include <iostream>
#include <vector>
#include <string>
#include <limits.h>
using namespace std;
int N,K,rome; //the number of cities and routes
string start;
vector<string> city;
vector<int> happiness;
vector<vector<int> > cost;
vector<bool> visit;
int bests, costs, happy, ave_happy;
int correctHappy, correctAveHappy;
int correctCosts=INT_MAX;
vector<int> route,correctRoute;
void dfs(int pre, int present, int end);
int main()
{
int i,hap;
string cit;
ios::sync_with_stdio(false);
cin>>N>>K>>start;
city.resize(N,start);
happiness.resize(N,0);
cost.resize(N,vector<int>(N,0));
visit.resize(N,false);
for(i=1;i<N;i++)
{
cin>>cit>>hap;
if(cit=="ROM")
rome=i;
city[i]=cit;
happiness[i]=hap;
}
string city1,city2;
int cos,j,m,n;
for(i=0;i<K;i++)
{
cin>>city1>>city2>>cos;
for(j=0;j<N;j++)
if(city1==city[j])
{
m=j;
break;
}
for(j=0;j<N;j++)
if(city2==city[j])
{
n=j;
break;
}
cost[m][n]=cos;
cost[n][m]=cos;
}
dfs(0,0,rome);
cout<<bests<<" "<<correctCosts<<" "<<correctHappy<<" "<<correctAveHappy<<endl;
cout<<city[correctRoute[0]];
for(i=1;i<correctRoute.size();i++)
cout<<"->"<<city[correctRoute[i]];
cout<<endl;
return 0;
}
void dfs(int pre, int present, int end)
{
if(costs>correctCosts)
return;
int i;
visit[present]=true;
costs+=cost[pre][present];
happy+=happiness[present];
route.push_back(present);
if(present==end)
{
ave_happy=happy/(route.size()-1);
if(costs<correctCosts)
{
bests=1;
correctCosts=costs;
correctRoute=route;
correctHappy=happy;
correctAveHappy=ave_happy;
return;
}
else if(costs==correctCosts)
{
bests++;
if(happy>correctHappy)
{
correctCosts=costs;
correctRoute=route;
correctHappy=happy;
correctAveHappy=ave_happy;
return;
}
else if(happy==correctHappy)
if(ave_happy>correctAveHappy)
{
correctCosts=costs;
correctRoute=route;
correctHappy=happy;
correctAveHappy=ave_happy;
return;
}
}
}
else
for(i=0;i<N;i++)
if(!visit[i]&&cost[present][i]!=0)
{
dfs(present,i,end);
route.pop_back();
costs-=cost[i][present];
happy-=happiness[i];
visit[i]=false;
}
}