HDOJ2112-HDU Today

7 篇文章 0 订阅
6 篇文章 0 订阅

题目链接

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

题目有几个细节要注意:

  • map要清空
  • 下标要归零
  • 起始和终止可能为同一个点
  • 这题不必须用C++避免TLE

每条都平均贡献了2个Wa TT, AC

#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 200;
const int maxm = 20005;

struct edge{
   int v, w, next;
}e[maxm];

int p[maxn], dis[maxn], n, eid;
long long cnt = 0;
bool vis[maxn];
map<string , int>nam;

int ton(string s){
   if(!nam.count(s)){
   	nam.insert(pair<string, int>(s, cnt));
   	return cnt++;
   }
   return nam[s];
}

void init(){
   memset(p, -1, sizeof(p));
   eid = 0;
}

void in(int u, int v, int w){
   e[eid].v = v;
   e[eid].w = w;
   e[eid].next = p[u];
   p[u] = eid++;
}

void insert(int u, int v, int w){
   in(u, v, w);
   in(v, u, w);
}

bool dijkstra(){
   memset(dis, inf, sizeof(dis));
   memset(vis, false, sizeof(vis));
   dis[0] = 0;
   for(int i = 0; i < cnt; i++){
   	int v, minw = inf;
   	for(int j = 0; j < cnt; j++)
   		if(!vis[j] && dis[j] < minw){
   			minw = dis[j];
   			v = j;
   		}
   	if(minw == inf)
   		return false;
   	vis[v] = true;
   	for(int j = p[v]; j != -1; j = e[j].next){
   		int x = e[j].v;
   		if(!vis[x] && dis[x] > dis[v] + e[j].w){
   			dis[x] = dis[v] + e[j].w;
   		}
   	}
   }
   return true;
}


int main(){
   while(~scanf("%d", &n) && n != -1){
   	cnt = 0;
   	init();
   	nam.clear();
   	string start, end, a, b;
   	int w;
   	cin>>start>>end;
   	ton(start);
   	ton(end);
   	for(int i = 0; i < n; i++){
   		cin>>a>>b>>w;
   		insert(ton(a), ton(b), w);
   	}
   	if(dijkstra())
   		printf("%d\n", dis[ton(end)]);
   	else
   		printf("-1\n");
   }
   return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值