此题主要是要用到字符串向整数的映射 , 很自然的想到了 STL 中的map ,哎,贡献无数次WA,最后才发现每次运行时 map 忘了清空 !!!!本题,用dijkstra 和 spfa 均可 ,但是要记着提交时用C++ ,用G++的话可能会超时。 此题为无向图,还应注意当出发站和终点站相同时输出 0 !!我用dijkstra 和 spfa 均能过,请看代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<cmath>
#include<map>
using namespace std ;
const int MAXN = 1005 ;
const int INF = 0x7fffffff ;
struct Node
{
int adj ;
int dist ;
Node * next ;
};
int cnt ;
Node *vert[MAXN] ; // 建立顶点头指针数组
int vis[MAXN] ;
int dis[MAXN] ; // 建立距离数组
map<string , int> mymap ;
void dijkstra(int v0)
{
int i ;
for ( i = 1 ; i <= cnt ; i ++)
{
dis[i] = INF ;
}
dis[v0] = 0 ;
vis[v0] = 1 ;
int min = INF ;
int u = v0 ;
Node * p ;
for (i = 1 ; i <= cnt - 1 ; i ++)
{
p = vert[u] ;
while (p != NULL)
{
int ty = p -> adj ;
int td = p -> dist ;
if(!vis[ty] && dis[u] + td <= dis[ty])
{
dis[ty] = dis[u] + td ;
}
p = p -> next ;
}
int j ;
min = INF ;
for(j = 1 ; j <= cnt ; j ++)
{
if(!vis[j] && dis[j] < min)
{
u = j ;
min = dis[j] ;
}
}
vis[u] = 1 ;
}
}
queue <int> mq ;
int inq[MAXN] ;
void spfa(int v0)
{
memset(inq , 0 , sizeof(inq)) ;
while (!mq.empty()) // 队列清空
mq.pop() ;
mq.push(v0) ;
inq[v0] ++ ;
int tmp ;
Node * p ;
int i ;
for( i = 1 ; i <= cnt ; i ++)
{
dis[i] =INF ;
}
dis[v0] = 0 ;
while (!mq.empty())
{
tmp = mq.front() ;
mq.pop() ;
inq[tmp] -- ;
p = vert[tmp] ;
while (p != NULL)
{
int tadj = p -> adj ;
int td = p -> dist ;
int tk ;
tk = dis[tmp] + td ;
if(dis[tmp] < INF && tk < dis[tadj] )
{
dis[tadj] = tk ;
if(inq[tadj] == 0)
{
mq.push(tadj) ;
inq[tadj] ++ ;
}
}
p = p -> next ;
}
} }
int main()
{
int n ;
while (scanf("%d", & n) != EOF)
{
if(n == -1)
break ;
memset(vis , 0 , sizeof(vis)) ;
memset(vert , 0 , sizeof(vert)) ;
mymap.clear() ; // 千万不要忘了把 map 清空 !!
cnt = 0 ;
string s1 , s2 ;
cin >> s1 ;
mymap[s1] = ++ cnt ;
cin >> s2 ;
int pan = 0 ;
if(s1 == s2)
{
pan = 1 ;
}
else
mymap[s2] = ++ cnt ;
int i ;
for (i = 0 ; i < n ; i ++)
{
string st1 ;
string st2 ;
int d ;
cin >> st1 >> st2 >> d ;
if(mymap.find(st1) == mymap.end())
{
mymap[st1] = ++ cnt ;
}
if(mymap.find(st2) == mymap.end())
{
mymap[st2] = ++ cnt ;
}
int t1 , t2 ;
t1 = mymap[st1] ;
t2 = mymap[st2] ;
Node * p ;
p = new Node ; // 建立邻接表
p -> adj = t2 ;
p -> dist = d ;
p -> next = vert[t1] ;
vert[t1] = p ; p = new Node ;
p -> adj = t1 ;
p -> dist = d ;
p -> next = vert[t2] ;
vert[t2] = p ;
}
if(pan == 1)
{
printf("0\n") ;
continue ;
}
//dijkstra(1) ;
spfa(1) ;
if(dis[2] < INF)
{
printf("%d\n" , dis[2]) ;
}
else
{
printf("-1\n") ;
}
}
return 0 ;
}

HDU 2112 HDU Today -- from lanshui_Yang的更多相关文章

  1. hdu 2112 HDU Today

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的 ...

  2. HDU 2112 HDU Today(Dijkstra)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Time Limit: 15000/5000 MS (Java/Others ...

  3. hdu 2112 HDU Today (floyd算法)

    这道题貌似在原来学长给我们的搞的小比赛中出过! 这次又让我遇到,果断拿下! 不过方法很蠢,跑了1000多ms,虽然要求5000ms以内! 题目就是给你一些位置之间的距离,然后再让你求特定的两点之间的距 ...

  4. hdu 2112 HDU Today (最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目大意:给出起点和终点,然后算出最短的路. 不过有好多细节要注意: (1)起始点和终止点相等的 ...

  5. hdu 2112 HDU Today 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目意思:又是求最短路的,不过结合埋字符串来考查. 受之前1004 Let the Balloo ...

  6. HDU 2112 HDU Today (Dijkstra算法)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. HDU 2112 HDU Today(最短路径+map)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. HDU 2112 HDU Today 最短路

    题目描述: Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这 ...

  9. hdu 2112 HDU Today(map与dijkstra的结合使用)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

随机推荐

  1. Android handler Thread 修改UI Demo

    /********************************************************************** * Android handler Thread 修改U ...

  2. 【兼容】IE下PNG色差

    IE(包括IE7)中的PNG色差问题http://bbs.blueidea.com/thread-2910513-1-1.html修正IE对PNG颜色显示错误的问题http://www.lizhenw ...

  3. data guard折腾记一

    终于有空闲的机器腾出来了,生产环境上的一套Oracle环境终于可以鸟枪换炮了,生产环境有Data Guard,为了减少停机时间,而且避免重新构建Data Guard的麻烦(其实也不麻烦,就是浪费时间) ...

  4. 【转】Android开发20——单个监听器监听多个按钮点击事件

    原文网址:http://woshixy.blog.51cto.com/5637578/1093936 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律 ...

  5. 理解$watch ,$apply 和 $digest --- 理解数据绑定过程

    原文地址:http://angular-tips.com/blog/2013/08/watch-how-the-apply-runs-a-digest/ 注 这篇博文主要是写给新手的,是给那些刚刚开始 ...

  6. POJ 2243 Knight Moves

    Knight Moves Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13222   Accepted: 7418 Des ...

  7. 34、Android中基于Socket的网络通信(一)

    Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求. 在java中,Socket和ServerSocket类库位于java.net包中,ServerSocket用于服 ...

  8. appium初探问题总结

    自从搭建好环境后,运行一个appdemo各种奇葩问题层出不穷,过后可能觉得是挺简单的问题,但对于初次接触的人来说,有砸电脑的冲动也不为过·这里将自己所遇到的问题记录下来,备忘. 问题一:照着网上的教程 ...

  9. 【译】 AWK教程指南 附录C-AWK的内建函数

    C.1 字串函数 index( 原字串, 查找的子字串 ) 若原字串中含有欲寻找的子字串,则返回该子字串在原字串中第一次出现的位置,若未曾出现该子字串则返回0. 例如: $ awk 'BEGIN{ p ...

  10. NOIP2014 联合权值

    2.联合权值 (link.cpp/c/pas) [问题描述] 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi  ,每条边的长度均为1.图上两点(u, v)的距离定义为u ...