ACM2112迪克斯特算法
HDU Today
这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,想去一个地方又不知道应该乘什么公交车,在什么地方转车,在什么地方下车(其实徐总自己有车,却一定要与民同乐,这就是徐总的性格)。
徐总经常会问蹩脚的英文问路:“Can you help me?”。看着他那迷茫而又无助的眼神,热心的你能帮帮他吗?
请帮助他用最短的时间到达目的地(假设每一路公交车都只在起点站和终点站停,而且随时都会开)。
第二行有徐总的所在地start,他的目的地end;
接着有n行,每行有站名s,站名e,以及从s到e的时间整数t(0<t<100)(每个地名是一个长度不超过30的字符串)。
note:一组数据中地名数不会超过150个。
如果N==-1,表示输入结束。
xiasha westlake
xiasha station 60
xiasha ShoppingCenterofHangZhou 30
station westlake 20
ShoppingCenterofHangZhou supermarket 10
xiasha supermarket 50
supermarket westlake 10
-1
#include<iostream>
#include<cstring>
using namespace std;
class Alphabet
{
public:
char s[];
Alphabet *next;
int index;
};
class BUS
{
public:
BUS(int n)//number of bus and followed lines
{
cnt=;
oo=;
number=n;
p=NULL;
head=NULL;
record=NULL;
Continue=true;//控制Deal函数的作用,为真时是输入使用,为假时是判断是否存在七点和终点
memset(vis,,sizeof(vis));
for(int i=;i<;i++)
for(int j=;j<;j++)
maze[i][j]=oo;
}
~BUS()
{
Alphabet *temp;
while(head!=NULL)
{
temp=head;
head=head->next;
delete temp;
}
}
void Command(char *str1,char *str2,int distance)
{
int a=Deal(str1);
int b=Deal(str2);
if(maze[a][b]>distance)
maze[a][b]=maze[b][a]=distance;
}
int Dijkstra(int s,int e)
{
int n=cnt-;
for(int i=;i<=n;i++)
low[i]=maze[s][i];
low[s]=;
vis[s]=;
int v;
for(int i=;i<n;i++)
{
int Min=oo;
for(int j=;j<=n;j++)
if(!vis[j]&&low[j]<Min)
{
Min=low[j];
v=j;
}
if(Min==oo)return -;
vis[v]=;
for(int j=;j<=n;j++)
{
if(!vis[j]&&low[j]>maze[v][j]+low[v])
low[j]=maze[v][j]+low[v];
}
}
return low[e];
}
int Deal(char *str)
{
int index=;
p=head;
while(p!=NULL)
{
if(strcmp(p->s,str)!=)
{
record=p;
p=p->next;
}
else
{
index=p->index;
break;
}
}
if(index==&&Continue)
return Insert(str);
return index;
}
void ChangeContinue()
{
Continue=false;
}
int Insert(char *str)
{
Alphabet *temp;
temp=record;
p=new Alphabet;
strcpy(p->s,str);
p->index=cnt++;
p->next=NULL;
if(head==NULL)
head=p;
else
temp->next=p;
return p->index;
}
private:
int oo;
int cnt,number;
Alphabet *p,*head,*record;
int maze[][];
int low[],vis[];
bool Continue;
};
int main()
{
int n,a,b,dis;
char s1[],kep1[];
char s2[],kep2[];
while(cin>>n&&n!=-)
{
BUS bus(n);
scanf("%s %s",kep1,kep2);
for(int i=;i<=n;i++)
{
scanf("%s %s %d",s1,s2,&dis);
bus.Command(s1,s2,dis);
}
bus.ChangeContinue();
a=bus.Deal(kep1);
b=bus.Deal(kep2);
if(!a||!b)
{
printf("-1\n");
continue;
}
if(strcmp(kep1,kep2)==)
{
printf("0\n");
continue;
}
int result=bus.Dijkstra(a,b);
printf("%d\n",result);
}
return ;
}
ACM2112迪克斯特算法的更多相关文章
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- 分布式系列文章——Paxos算法原理与推导
Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- 红黑树——算法导论(15)
1. 什么是红黑树 (1) 简介 上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...
- 散列表(hash table)——算法导论(13)
1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...
- 虚拟dom与diff算法 分析
好文集合: 深入浅出React(四):虚拟DOM Diff算法解析 全面理解虚拟DOM,实现虚拟DOM
- 简单有效的kmp算法
以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...
- 神经网络、logistic回归等分类算法简单实现
最近在github上看到一个很有趣的项目,通过文本训练可以让计算机写出特定风格的文章,有人就专门写了一个小项目生成汪峰风格的歌词.看完后有一些自己的小想法,也想做一个玩儿一玩儿.用到的原理是深度学习里 ...
- 46张PPT讲述JVM体系结构、GC算法和调优
本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.(内嵌iframe,建议使用电脑浏览) 好东西当然要分享,PPT已上传可供下载 ...
随机推荐
- LeetCode 98——验证二叉搜索树
1. 题目 2. 解答 2.1. 方法一 我们初始化根节点的范围为长整形数据的最小最大值 \([LONG\_MIN,LONG\_MAX]\),则其左子节点的取值范围为 \([LONG\_MIN,根节点 ...
- Python3 小工具-MAC泛洪
from scapy.all import * import optparse def attack(interface): pkt=Ether(src=RandMAC(),dst=RandMAC() ...
- lintcode-158-两个字符串是变位词
158-两个字符串是变位词 写出一个函数 anagram(s, t) 判断两个字符串是否可以通过改变字母的顺序变成一样的字符串. 说明 What is Anagram? Two strings are ...
- PowerMock用法[转]
转:http://agiledon.github.io/blog/2013/11/21/play-trick-with-powermock/ 当我们面对一个遗留系统时,常见的问题是没有测试.正如Mic ...
- java 文件操作知识点
1.每个文件以一个文件路径和文件名称进行表示,在不同的操作系统环境下,文件路径的表示形式是不一样的,例如在Windows操作系统中一般的表示形式为C:\windows\system,而Unix上的表示 ...
- 使用Windows Live Writer拉取之前写的博客
因为之前写的博客有错误需要修改,但是在Windows Live Writer中找了半天也没找到怎么拉取之前的博客,在[打开本地草稿]或者[打开最近使用过的日志]中,由于存储的项数有限,所以就找不到那篇 ...
- TCP/IP协议与OSI协议
OSI协议是一个理想化的协议,它把网络传输过程分为七层模型,以达到形象化的理解的效果,在实际应用中没有被使用.TCP/IP协议可以看作是它的简化版,是目前应用最广泛的网络协议,许多协议都是以它为基础而 ...
- Windows7系统目录迁移:Users,Progr…
微软设计了比如:我的文档.我的OOXX,之类的东西,在WIN7下面更连游戏.下载等等目录都设计好了,我也很乖巧的把各种文件都分门别类的放进去了. 同时也很厉害的设计在了“%HOMEDRIVE%”里面, ...
- 【bzoj1131】[POI2008]Sta 树形dp
题目描述 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 输入 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. 输出 输出你所找到的点,如果具有 ...
- 利用cmake查看opencv的源码
当我们有时想查看opencv自带的函数的源代码,比如函数cvCreateImage, 此时我们选中cvCreateImage, 点击鼠标右键->转到定义,我们会很惊讶的发现为什么只看到了cvCr ...