HDU 2112 HDU Today -- from lanshui_Yang
此题主要是要用到字符串向整数的映射 , 很自然的想到了 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的更多相关文章
- hdu 2112 HDU Today
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的 ...
- HDU 2112 HDU Today(Dijkstra)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Time Limit: 15000/5000 MS (Java/Others ...
- hdu 2112 HDU Today (floyd算法)
这道题貌似在原来学长给我们的搞的小比赛中出过! 这次又让我遇到,果断拿下! 不过方法很蠢,跑了1000多ms,虽然要求5000ms以内! 题目就是给你一些位置之间的距离,然后再让你求特定的两点之间的距 ...
- hdu 2112 HDU Today (最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目大意:给出起点和终点,然后算出最短的路. 不过有好多细节要注意: (1)起始点和终止点相等的 ...
- hdu 2112 HDU Today 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目意思:又是求最短路的,不过结合埋字符串来考查. 受之前1004 Let the Balloo ...
- HDU 2112 HDU Today (Dijkstra算法)
HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 2112 HDU Today(最短路径+map)
HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 2112 HDU Today 最短路
题目描述: Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这 ...
- hdu 2112 HDU Today(map与dijkstra的结合使用)
HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
随机推荐
- 手动添加 memcached.jar包
由于目前java memcached client没有官方的maven repository可供使用,因此使用时需要手动将其安装到本地repository. java memcached client ...
- C++中巧妙的位运算
位运算要多想到与预算和异或运算,并常常将两个数对应位上相同和不同分开处理 一.x&(x-1)消除x二进制中最右边的一个1. 这个比较厉害,比如统计某个 二.与和异或的巧妙结合的思想 与运算可以 ...
- virtualbox怎么装系统OVA虚拟包大全一键安装
1 第一步,下载ova虚拟包 http://pan.baidu.com/s/1hqxWkUo . 里面有win7.ubuntu.kali,你自己挑一个需要的 全都可以自动缩放屏幕,有VirtualBo ...
- naotu.baidu.com 非常棒的脑图在线工具
1.png 2.txt 短租 前台功能 房源查看 房源搜索 城市房源 注册登录 预定房源 房源退订 在线支付 评价房源 个人中心 我的订单 我的账户 我的收藏 消息通知 管理员后台 房源发布 会员管理 ...
- 谈谈Runtime类中的freeMemory,totalMemory,maxMemory等几个方法
最近在网上看到一些人讨论到java.lang.Runtime类中的freeMemory(),totalMemory(),maxMemory ()这几个方法的一些问题,很多人感到很疑惑,为什么,在jav ...
- I.MX6 Linux kernel LVDS backlight enable
/*************************************************************************** * I.MX6 Linux kernel LV ...
- Java 7 Fork/Join 并行计算框架概览
应用程序并行计算遇到的问题 当硬件处理能力不能按摩尔定律垂直发展的时候,选择了水平发展.多核处理器已广泛应用,未来处理器的核心数将进一步发布,甚至达到上百上千的数量.而现在 很多的应用程序在运行在多核 ...
- Scrum 体验活动笔记
2014-03-10 Isoftstone library 1.识别角色(用户),形象 :名称.痛处.属性.需求 2.编写故事 story以验证需求是否正确:我们假设(客户) 进行验证结果... ...
- SQL中的CASE WHEN用法
其语法如下: 1)case vlaue when [compare-value]then reslut [when[compare-value]] then result ...] [else res ...
- lightoj 1015
水题,统计大于0的和. #include<cstdio> int main(){ int t, n, tmp; scanf("%d", &t); for(int ...