zoukankan      html  css  js  c++  java
  • 哈理工 oj 2122 旅行(map + 最短路dij算法)

    旅行
    Time Limit: 1000 MS Memory Limit: 32768 K
    Total Submit: 18(6 users) Total Accepted: 3(3 users) Rating: Special Judge: No
    Description

    04.24,和Sakura去东京天空树,世界上最暖和的地方天空树的顶上。

    04.26。和Sakura去明治神宫。有人在那里举办婚礼。”

    04.25。和Sakura去迪士尼。鬼屋非常可怕。可是有Sakura在,所以不可怕。

    Sakura最好了。”

                                        ——江南 《龙族》

     

    绘梨衣和路明非今天要从迪士尼前往天空树,但他们的钱不多了,所以能省则省,他们如今有一个地图上面有n个景点和m条景点之间的路,每条路坐车都须要一定的钱数,如今他们求助于你,请你帮他们计算下从当前地点到目的地最少须要的钱数。

    Input

    有多组数据,每组数据第一行有两个数字2<=n<=300001<=m<=30000

    接下来n行输入n个地名。

    接下来m行每行有两个字符串(长度不超过20)和一个数字,代表两地之间的坐车的费用。

    接下来一行输入两个字符串分别代表起点和终点。

    Output

    一个int数代表最少须要的钱数。

    数据保证不会超过int型范围。

    Sample Input
    2 1
    disney
    TokyoSkyTree
    disney TokyoSkyTree 1
    disney TokyoSkyTree
    Sample Output
    1
    Source

    2014暑假集训练习赛(7月19日)

    看到 理工题目上 这个题目做的人没几个  。就看看是什么玩意儿~!~

    #include<iostream>
    #include<sstream>
    #include<algorithm>
    #include<cstdio>
    #include<string.h>
    #include<cctype>
    #include<string>
    #include<cmath>
    #include<vector>
    #include<stack>
    #include<queue>
    #include<map>
    #include<set>
    using namespace std;
    const int maxn=30003;
    const int INF=0x1f1f1f1f;
    int n,m;
    //标记起始位置
    string s;
    string e;
    map<string,int>cnt;//映射成节点编号
    
    struct Edge
    {
        int from,to,dist;
        Edge(int u,int v,int d):from(u),to(v),dist(d) {}
    };
    vector<Edge>edges;//存储边的结点信息
    vector<int>G[maxn];//邻接表
    bool done[maxn];   //标记是否訪问过
    int d[maxn];    //距离数组
    struct heapnode //用于优先队列自己定义
    {
        int d,u;
        bool operator <(const heapnode rhs) const
        {
            return d > rhs.d;
        }
        heapnode(int dd,int uu):d(dd),u(uu) {}
    };
    
    
    void init()//初始化不可缺少
    {
        for(int i=0; i<n; i++)
            G[i].clear();
        edges.clear();
    }
    
    void addedge(int from,int to,int dist)
    {
        edges.push_back(Edge(from,to,dist));
        int m = edges.size();
        G[from].push_back(m-1);
    }
    
    void dij( int s)
    {
        priority_queue<heapnode>Q;
        for(int i=0; i<=n; i++)//初始化距离数组
            d[i]=INF;
        d[s]=0;
        memset(done ,0,sizeof(done));
        Q.push( heapnode(0,s) );
        while(!Q.empty())
        {
            heapnode x = Q.top();
            Q.pop();
            int u=x.u;
            if(u==cnt[e])
            {
                printf("%d
    ",x.d);
                break;
            }
            if(done[u])continue;
            done[u] = true;
            for(int i=0; i<G[u].size(); i++)
            {
                Edge& e=edges[G[u][i]];//取出来一条邻接边
                if(d[e.to]>d[u]+e.dist)
                {
                    d[e.to] = d[u] + e.dist;
                    Q.push((heapnode(d[e.to],e.to)));
                }
            }
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            int t=1;
            int ans=0;
            string str;
            init();
            for(int i=0; i<n; i++)
            {
                cin>>str;
                cnt[str]=t++;
            }
            for(int i=0; i<m; i++)
            {
                string str2;
                int x;
                cin>>str>>str2>>x;
                addedge(cnt[str],cnt[str2],x);
                addedge(cnt[str2],cnt[str],x);
            }
            cin>>s>>e;
            dij(cnt[s]);
            s.clear();
            e.clear();
            cnt.clear();
        }
        return 0;
    }
    /*
    2 1
    a
    v
    a v 1
    a v
    3 2
    a
    b
    c
    a b 2
    b c 3
    a c
    */
    


  • 相关阅读:
    清除cookie
    判断是否为中文
    正则表达式
    smarty基础语法
    smarty模板
    ajax
    php工作笔记1
    PHP中超全局变量$GLOBALS和global的区别
    SQL连表查询
    linux上安装git(客户端)及GitHub的配置
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7100340.html
Copyright © 2011-2022 走看看