zoukankan      html  css  js  c++  java
  • PAT (Advanced Level) 1087 All Roads Lead to Rome

    题解

        最短路径经典题型。套最短路的板子再加上额外的要求就可以了(说起来好简单)。SPFA也行,Dijkstra也可以。这里我用的是SPFA。因为题目要求,将地名和其对应的数字用map映射一下,这样方便处理。

             same[i]代表到达地点 i 有几种路径;

             dist[i]代表从起点到地点 i 的最短距离;

             happy[i]代表从起点到地点 i 的幸福值;

             cnt[i]代表从起点到地点 i 需要经过几个城市;

             ans[i]代表从哪个地点到达了地点 i ;

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=250,inf=0x3fffffff;
    struct node
    {
        int v,w;
        node(int a,int b)
        {v=a;w=b;}
    };
    int same[maxn]={0,1},dist[maxn],vis[maxn],happy[maxn],cnt[maxn],ans[maxn];
    int value[maxn],N,K;
    map<string,int> smapi;
    map<int,string> imaps;
    vector<node> edge[maxn];
    void spfa(int s);
    void print(int p);
    int main() 
    {
        string str_s,str,u,v;
        int i,w,end;
        scanf("%d%d",&N,&K);
        cin>>str_s;
        smapi[str_s]=1; imaps[1]=str_s;
    
        for(i=2;i<=N;i++)
        {
            cin>>str>>w;
            if(str=="ROM") end=i;
            smapi[str]=i; imaps[i]=str;
            value[i]=w;
        }
    
        for(i=0;i<K;i++)
        {
            cin>>u>>v>>w;
            edge[smapi[u]].push_back(node(smapi[v],w));
            edge[smapi[v]].push_back(node(smapi[u],w));
        }
    
        spfa(1);
    
        printf("%d %d %d %d
    ",same[end],dist[end],happy[end],happy[end]/cnt[end]);
        print(ans[end]);
        printf("ROM");
    
        system("pause");
        return 0;
    }
    void print(int p)
    {
        if(p==0) return ;
        print(ans[p]);
        printf("%s->",imaps[p].c_str());
    }
    void spfa(int s)
    {
        queue<int> que;
        int p,i,v,w;
    
        fill(dist+2,dist+maxn,inf);
        que.push(s);
        while(!que.empty())
        {
            p=que.front();que.pop();
            vis[p]=0;
            for(i=0;i<edge[p].size();i++)
            {
                v=edge[p][i].v;
                w=edge[p][i].w;
    
                if(dist[v]>dist[p]+w)
                {
                    dist[v]=dist[p]+w;
                    happy[v]=happy[p]+value[v];
                    cnt[v]=cnt[p]+1;
                    ans[v]=p;
                    same[v]=same[p];
                    if(!vis[v])
                    {
                        que.push(v);
                        vis[v]=1;
                    }
                }
                else if(dist[v]==dist[p]+w)
                {
                    same[v]+=same[p];
                    if(happy[v]<happy[p]+value[v])
                    {
                        happy[v]=happy[p]+value[v];
                        cnt[v]=cnt[p]+1;
                        ans[v]=p;
                    }
                    else if(happy[p]+value[v]==happy[v])
                    {
                        if(cnt[v]>cnt[p]+1)
                        {
                            cnt[v]=cnt[p]+1;
                            ans[v]=p;
                        }
                    }
                }
            }
        }
    }
  • 相关阅读:
    linux shell学习一点点
    【转】gcc中的-w -W和-Wall选项
    gcc 与 g++的区别
    javascript 时间格式(很方便的原生函数)
    js跳出循环的方法区别( break, continue, return ) 及 $.each 的(return true 和 return false)
    weex stream 方法封装
    数组遍历 map()、forEach() 及 字符串切割 split() / 字符串截取 slice()、substring()、substr()
    underscore.js 页面数据渲染
    mysql 安装与启动
    CSS3 animation(动画) 属性
  • 原文地址:https://www.cnblogs.com/VividBinGo/p/12231705.html
Copyright © 2011-2022 走看看