题目链接:点击打开链接
题目大意:略。
解题思路:经典。
AC 代码
using namespace std;
typedef long long ll;
const int maxn=250;
int n,m,w,d;
// 幸福指数rs  幸福指数    记录访问   最短距离rs 路径记录   路径条数    结点个数
int cst[maxn], cost[maxn], vis[maxn], dis[maxn], pre[maxn], path[maxn], vex[maxn];
int g[maxn][maxn];
string s,su,sv;
unordered_map<int,string> name;
unordered_map<string,int> id;
void init()
{
    mem(dis,INF), mem(g,INF), mem(pre,-1);
    mem(vis,0), mem(cost,0), mem(path,0), mem(vex,0), mem(cst,0);
}
int dijkstra(int v)
{
    dis[v]=0, path[v]=1;
    while(1)
    {
        int mi=INF;
        v=-1;
        for(int i=1;i<=n;i++)
            if(!vis[i] && dis[i]<mi)
                mi=dis[i], v=i;
        if(v==d) return 1;
        if(v==-1) return 0;
        vis[v]=1;
        for(int i=1;i<=n;i++)
        {
            if(!vis[i] && mi+g[v][i]<dis[i])
            {
                dis[i]=mi+g[v][i];
                cst[i]=cst[v]+cost[i];
                path[i]=path[v];
                vex[i]=1+vex[v];
                pre[i]=v;
            }
            else if(!vis[i] && mi+g[v][i]==dis[i])
            {
                path[i]+=path[v];
                if(cst[i]<cst[v]+cost[i])
                {
                    cst[i]=cst[v]+cost[i];
                    vex[i]=1+vex[v];
                    pre[i]=v;
                }
                else if(cst[i]==cst[v]+cost[i] && vex[i]>vex[v]+1)
                {
                    vex[i]=vex[v]+1;
                    pre[i]=v;
                }
            }
        }
    }
}
int main()
{
    init();
    scanf("%d%d",&n,&m), cin>>s;
    name[1]=s, id[s]=1, cost[1]=0;
    for(int i=2;i<=n;i++)
    {
        cin>>su>>w;
        name[i]=su, id[su]=i, cost[i]=w;
        if(su=="ROM") d=i;
    }
    for(int i=0;i<m;i++)
    {
        cin>>su>>sv>>w;
        g[id[su]][id[sv]]=g[id[sv]][id[su]]=w;
    }
    if(dijkstra(id[s]))
    {
        vector<int> vec;
        printf("%d %d %d %d\n",path[d],dis[d],cst[d],int(cst[d]*1.0/vex[d]));
        int h=d;
        while(h!=-1)
        {
            vec.push_back(h);
            h=pre[h];
        }
        for(int i=vec.size()-1;i>=0;i--)
            printf("%s%s",name[vec[i]].c_str(),i==0?"\n":"->");
    }
    else puts("-1");
    return 0;
}









