#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<map>
const int maxn=500;
const int INF=100000000;
using namespace std;
map<string,int> strtoin;
map<int,string> intostr;
int nummember=0;
//编号
int change(string str)
{
if(strtoin.find(str)==strtoin.end())
{
strtoin[str]=nummember;
intostr[nummember]=str;
return nummember++;
}
else
return strtoin[str];
}
int cost[maxn][maxn];
int c[maxn];
int visit[maxn]={false};
int n,k;
int s,d;//起点,终点
vector<int> pre[maxn];
void dijkstra(int s)
{
fill(c,c+maxn,INF);
c[s]=0;
for(int i=0;i<n;i++)
{
int u=-1;
int min=INF;
for(int j=0;j<n;j++)
{
if(visit[j]==false&&c[j]<min)
{
u=j;
min=c[j];
}
}
if(u==-1)
return;
visit[u]=true;
for(int v=0;v<n;v++)
{
if(visit[v]==false&&cost[u][v]!=INF)
{
if(cost[u][v]+c[u]<c[v])
{
c[v]=cost[u][v]+c[u];
pre[v].clear();
pre[v].push_back(u);
}
else if(cost[u][v]+c[u]==c[v])
{
pre[v].push_back(u);
}
}
}
}
}
vector<int>path,temppath;
int optvalue=0;
int happy[maxn]={0};
int num=0;
vector<int> sum;
void dfs(int v)
{
if(v==s)
{
num++;
temppath.push_back(v);
int value=0;
for(int i=temppath.size()-1;i>=0;i--)
{
value+=happy[temppath[i]];
}
sum.push_back(value);
if(value>optvalue)
{
optvalue=value;
path=temppath;
}
temppath.pop_back();
return;
}
temppath.push_back(v);
for(int i=0;i<pre[v].size();i++)
{
dfs(pre[v][i]);
}
temppath.pop_back();
}
string str;
int main()
{
int h;
fill(cost[0],cost[0]+maxn*maxn,INF);
scanf("%d%d",&n,&k);
cin>>str;
s=change(str);
for(int i=0;i<n-1;i++)
{
cin>>str>>h;
int id=change(str);
happy[id]=h;
if(str=="ROM")
{
d=strtoin["ROM"];
}
}
string str1,str2;
int _temp;
for(int i=0;i<k;i++)
{
cin>>str1>>str2>>_temp;
cost[strtoin[str1]][strtoin[str2]]=cost[strtoin[str2]][strtoin[str1]]=_temp;
}
dijkstra(s);
dfs(d);
int average=optvalue/(path.size()-1);
printf("%d %d %d %d\n",num,c[d],optvalue,average);
for(int i=path.size()-1;i>=0;i--)
{
cout<<intostr[path[i]];
if(i>0)
printf("->");
}
system("pause");
return 0;
}
PAT 1087
最新推荐文章于 2021-12-08 01:35:03 发布