hdu 2112 dijkstra+优先队列

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2112

HDU Today

Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 15727    Accepted Submission(s): 3693

Problem Description

经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强。这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,开始安度晚年了。

这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。

徐总经常会问蹩脚的英文问路:“Can you help me?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗?

请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。

Input

输入数据有多组,每组的第一行是公交车的总数N(0<=N<=10000);

第二行有徐总的所在地start,他的目的地end;

接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0<t<100)(每个地名是一个长度不超过30的字符串)。

note:一组数据中地名数不会超过150个。

如果N==-1,表示输入结束。

Output

如果徐总能到达目的地,输出最短的时间;否则,输出“-1”。

Sample Input

6
xiasha westlake
xiasha station 60
xiasha ShoppingCenterofHangZhou 30
station westlake 20
ShoppingCenterofHangZhou supermarket 10
xiasha supermarket 50
supermarket westlake 10
-1

Sample Output

50

Hint:
The best route is:
xiasha->ShoppingCenterofHangZhou->supermarket->westlake

虽然偶尔会迷路,但是因为有了你的帮助
**和**从此还是过上了幸福的生活。

――全剧终――

WA了13次把这道题A了

思路:如果把这道题的字符串处理一下,来一套模板就产不多了

但是要注意的地方比较多,(1)如果起始点和终点一样,那么输出0,

(2)C++提交

( 3 )可能会有重边,取时间最短的更新

我用的是dijkstra+优先队列 O(nlogn)

#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <vector>
#include <map>
const int maxn=2200;
const int INF=99999999;
using namespace std;
typedef pair<int ,int >P;

struct edge
{
  int to,cost;
  edge(){};
  edge(int _to,int _cost)
  {
    to=_to;
    cost=_cost;
  }
};

vector<edge>G[maxn];
int dist[maxn],len[maxn][maxn];

void dijkstra()
{
  priority_queue<P,vector<P>,greater<P> >que;
  for(int i=0;i<maxn-10;i++)dist[i]=INF;
  dist[1]=0;
  que.push(P(0,1));
  while(!que.empty())
  {
   P p=que.top();
        que.pop();
   int v=p.second,d=p.first;
   for(int i=0;i<G[v].size();i++)
   {
      edge e=G[v][i];
      int d2=e.cost+d;
      if(dist[e.to]>d2)
      {
        dist[e.to]=d2;
        que.push(P(dist[e.to],e.to));
      }
   }
  }
}
void init()
{
  for(int i=0;i<maxn-10;i++)
        for(int j=0;j<maxn-10;j++)
          len[i][j]=INF;
  for(int i=1;i<maxn-10;i++)G[i].clear();
}
int main()
{
  int n;

   map<string,int>mp;
     string s1,s2;
  while(scanf("%d",&n)!=EOF&&n!=-1)
  {

    mp.clear();
    init();

    cin>>s1>>s2;
    int ct=1;
    mp[s1]=1;
    if(!mp[s2])mp[s2]=++ct;
    for(int i=0;i<n;i++)
    {
      string a,b;
      int lenth;
      cin>>a>>b>>lenth;
      if(!mp[a])mp[a]=++ct;
      if(!mp[b])mp[b]=++ct;
      if(len[mp[a]][mp[b]]>lenth)
      {
         len[mp[a]][mp[b]]=lenth;
         len[mp[b]][mp[a]]=lenth;
      }
      G[mp[a]].push_back(edge(mp[b],len[mp[a]][mp[b]]));
      G[mp[b]].push_back(edge(mp[a],len[mp[a]][mp[b]]));
    }
    dijkstra();
    if(dist[mp[s2]]==INF)printf("-1\n");
    else printf("%d\n",dist[mp[s2]]);
  }
  return 0;
}
时间: 2024-10-29 10:45:33

hdu 2112 dijkstra+优先队列的相关文章

HDU 2112 HDU Today (Dijkstra算法)

HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13952    Accepted Submission(s): 3264 Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候

HDU 2112 HDU Today,最短路径算法,Dijkstra

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 13396    Accepted Submission(s): 3144 Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HD

HDU 1874-畅通工程续(Dijkstra+优先队列)

畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28578    Accepted Submission(s): 10382 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行

hdu 2112 (最短路+map)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14515    Accepted Submission(s): 3405 Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发

hdu 2112 HDU Today (最短路)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目大意:给出起点和终点,然后算出最短的路. 不过有好多细节要注意: (1)起始点和终止点相等的时候,这里注意不能直接输出0,必须用标记,因为数据可能还没有处理完!!!此处贡献n次wa. (2)这里是某大神教我的用map进行转换,将字符串转换成数字,值得参考.map<string,int>M,V:不过这里同样是wa了好多次.要注意的是将最先输入的开始和结束的点也要放到这个map里面. (3)

hdu 2112 HDU Today 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目意思:又是求最短路的,不过结合埋字符串来考查. 受之前1004 Let the Balloon Rise 学到用map 的解法做之后,有点蠢蠢欲动,当时见到要用字典树做有点吓坏了(之前看过下,非一般难理解,所以暂时放下了).于是,死就死吧,硬住头皮用map做,反反复复修改终于过了. 首先是memory limit exceeded,因为无读清题目意思,直接开10000 * 10000的数组

地铁 Dijkstra(优先队列优化) 湖南省第五届省赛

传送门:地铁 思路:拆点,最短路:拆点比较复杂,所以对边进行最短路,spfa会tle,所以改用Dijkstra(优先队列优化) 模板 /************************************************************** Problem: User: youmi Language: C++ Result: Accepted Time: Memory: *****************************************************

UVA 658 It&#39;s not a Bug, it&#39;s a Feature! (单源最短路,dijkstra+优先队列,变形,经典)

题意:有n个bug,有m个补丁,每个补丁有一定的要求(比如某个bug必须存在,某个必须不存在,某些无所谓等等),打完出来后bug还可能变多了呢.但是打补丁是需要时间的,每个补丁耗时不同,那么问题来了:要打多久才能无bug?(同1补丁可重复打) 分析: n<=20,那么用位来表示bug的话有220=100万多一点.不用建图了,图实在太大了,用位图又不好玩.那么直接用隐式图搜索(在任意点,只要满足转移条件,任何状态都能转). 但是有没有可能每个状态都要搜1次啊?那可能是100万*100万啊,这样出题

hdu 1548 (dijkstra解法)(一次AC就是爽)

恭喜福州大学杨楠获得[BestCoder Round #4]冠军(iPad Mini一部) <BestCoder用户手册>下载 A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11670    Accepted Submission(s): 4430 Problem Description There is