睡不着,写一道题,dijkstra+dfs
卡的点:输出输反了。。还有就是没看懂题,the average happiness (take the integer part only) of the recommanded route的意思我还以为是所有最短的路径平均值,不过过样例就知道了。
#include<bits/stdc++.h>
using namespace std;
const int INF=1000000000;
const int maxn=20000;
int s2i(string str){
int sum=0;
for(int i=0;i<3;i++){
sum=sum*26+str[i]-'A';
}
return sum;
}
string i2s(int a){
string str;
for(int i=0;i<3;i++){
str+=(char)(a/(int)pow(26,2-i)+'A');
a%=(int)pow(26,2-i);
}
return str;
}
struct node{
int v,l;
};
vector<node>g[maxn];
vector<int> pre[maxn];
int weight[maxn],d[maxn];
bool vis[maxn];
void dijkstra(int s){
fill(d,d+maxn,INF);
fill(vis,vis+maxn,false);
d[s]=0;
for(int i=0;i<maxn;i++){
int minn=INF,u=-1;
for(int j=0;j<maxn;j++){
if(vis[j]==false&&d[j]<minn){
minn=d[j];
u=j;
}
}
if(u==-1)return;
vis[u]=true;
for(int j=0;j<g[u].size();j++){
int v=g[u][j].v;
if(vis[v]==false){
if(d[v]>d[u]+g[u][j].l){
d[v]=d[u]+g[u][j].l;
pre[v].clear();
pre[v].push_back(u);
}
else if(d[v]==d[u]+g[u][j].l){
pre[v].push_back(u);
}
}
}
}
}
int st,ed;
vector<int>temppath,path;
int num=0,happy=0;
int sum=0;
void dfs(int v){
if(v==st){
temppath.push_back(v);
num++;
int h=0;
for(int i=0;i<temppath.size();i++){
h+=weight[temppath[i]];
}
int avg=1.0*h/(temppath.size()-1);
if(h>happy){
happy=h;
sum=avg;
path=temppath;
}
else if(h==happy&&avg>sum){
happy=h;
sum=avg;
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();
}
int main(){
int n,k;
string bg;//lai dian
cin>>n>>k>>bg;
st=s2i(bg);
ed=s2i("ROM");
string str;
int temp;
for(int i=0;i<n-1;i++){
cin>>str>>temp;
weight[s2i(str)]=temp;
}
string str1,str2;
for(int i=0;i<k;i++){
cin>>str1>>str2>>temp;
node now;
now.v=s2i(str1);
now.l=temp;
g[s2i(str2)].push_back(now);
now.v=s2i(str2);
g[s2i(str1)].push_back(now);
}
weight[st]=0;
dijkstra(st);
dfs(ed);
printf("%d %d %d %d\n",num,d[ed],happy,sum);
for(int i=path.size()-1;i>=0;i--){
cout<<i2s(path[i]);
if(i!=0)cout<<"->";
}
return 0;
}