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 ...
随机推荐
- strcat与strncat的C/C++实现
2013-07-05 15:47:19 本函数给出了几种strcat与strncat的实现,有ugly implementation,也有good implementation.并参考标准库中的imp ...
- WinAPI——UnhookWindowsHookEx - 卸掉钩子
UnhookWindowsHookEx( hhk: HHOOK {钩子句柄} ): BOOL; {True/False}
- 1126. Magnetic Storms(单调队列)
1126 最简单的单调队列应用吧 单调队列是指在一个队列中各个元素单调 递增(或者递减),并且各个元素的下标单调 递增. 单调队列的大体操作 进队时,将进队的元素为e,从队尾往前扫描,直到找到一个不大 ...
- Codeforces Round #228 (Div. 2) C. Fox and Box Accumulation(贪心)
题目:http://codeforces.com/contest/389/problem/C 题意:给n个箱子,给n个箱子所能承受的重量,每个箱子的重量为1: 很简单的贪心,比赛的时候没想出来.... ...
- poj 1850 code(组合数学)
题目:http://poj.org/problem?id=1850 题意:按给定的规则给字母编号. 一个很简单的题目,但是却做了好久.................................. ...
- spring + mybatis 注解式事务不回滚的原因分析 @Transactional
在一个项目中发现spring的事务无法回滚. DEBUG: org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.ses ...
- bzoj1084: [SCOI2005]最大子矩阵
dp.状态转移方程在代码里 #include<cstdio> #include<algorithm> #include<cstring> using namespa ...
- [NOI2005] 维修数列
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 8397 Solved: 2530 Description In ...
- Android handler Thread 修改UI Demo
/********************************************************************** * Android handler Thread 修改U ...
- ubuntuy用户切换和密码修改
修改当前用户的密码 $passwd 修改用户密码 $sudo passwd 用户名 切换到其他帐号(需要该用户的密码) $su 用户名 切换到root帐号 $sudo -s