您的位置:首页 > Web前端

ZJU2027 Travelling Fee - 最短路径

2008-02-11 21:15 246 查看
题目描述:

无向带权图中,边数不超过100。从一个起点旅行到一个目的地,你所走的路线中费用最大的一条路可以免费,要求这次旅行的最小费用。

分析:

这是个变形的最短路径题目。核心思想还是使用Dijkstra算法。关于如何选择免费的边,我们可以枚举:

设起点和终点分别为sou,des。枚举所有边ei,其端点为xi,yi。

断开边ei,计算ei两个端点分别到起点终点的最短路径之和。这里有两种情况,即xi到sou,yi到des;和xi到des,yi到sou,取两者最小值。这样得到以ei作为免费边的最少费用。

枚举完所有边,取最小值即可。

至于字符串,可以使用Hash函数来编号推荐用ELFHash函数,这个题目我只开了2倍的Hash数组都能AC~

#define M 1002
int ELFHash(char *str)
{
unsigned int hash=0;
unsigned int x=0;
while(*str)
{
hash=(hash<<4)+(*str++);
if((x=hash&0xF0000000L)!=0)
{
hash^=(x>>24);
hash&=~x;
}
}
return hash%(M-1)+1;
}

主要的优化还是在Dijkstra算法上,用链表+堆可以很快也省空间。

排名第5~ 很高兴~ :)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: