ACM2112迪克斯特算法

HDU Today

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

  1 #include<iostream>
  2 #include<cstring>
  3 using namespace std;
  4 class Alphabet
  5 {
  6     public:
  7     char s[50];
  8     Alphabet *next;
  9     int index;
 10 };
 11 class BUS
 12 {
 13     public:
 14         BUS(int n)//number of bus and followed lines
 15         {
 16             cnt=1;
 17             oo=11111111;
 18             number=n;
 19             p=NULL;
 20             head=NULL;
 21             record=NULL;
 22             Continue=true;//控制Deal函数的作用,为真时是输入使用,为假时是判断是否存在七点和终点
 23             memset(vis,0,sizeof(vis));
 24             for(int i=0;i<200;i++)
 25             for(int j=0;j<200;j++)
 26             maze[i][j]=oo;
 27         }
 28         ~BUS()
 29         {
 30             Alphabet *temp;
 31             while(head!=NULL)
 32             {
 33                 temp=head;
 34                 head=head->next;
 35                 delete temp;
 36             }
 37         }
 38         void Command(char *str1,char *str2,int distance)
 39         {
 40             int a=Deal(str1);
 41             int b=Deal(str2);
 42             if(maze[a][b]>distance)
 43             maze[a][b]=maze[b][a]=distance;
 44         }
 45         int Dijkstra(int s,int e)
 46         {
 47             int n=cnt-1;
 48             for(int i=1;i<=n;i++)
 49             low[i]=maze[s][i];
 50             low[s]=0;
 51             vis[s]=1;
 52             int v;
 53             for(int i=1;i<n;i++)
 54             {
 55                 int Min=oo;
 56                 for(int j=1;j<=n;j++)
 57                     if(!vis[j]&&low[j]<Min)
 58                     {
 59                         Min=low[j];
 60                         v=j;
 61                     }
 62                 if(Min==oo)return -1;
 63                 vis[v]=1;
 64                 for(int j=1;j<=n;j++)
 65                 {
 66                     if(!vis[j]&&low[j]>maze[v][j]+low[v])
 67                     low[j]=maze[v][j]+low[v];
 68                 }
 69             }
 70             return low[e];
 71         }
 72         int Deal(char *str)
 73         {
 74             int index=0;
 75             p=head;
 76             while(p!=NULL)
 77             {
 78                 if(strcmp(p->s,str)!=0)
 79                 {
 80                     record=p;
 81                     p=p->next;
 82                 }
 83                 else
 84                 {
 85                     index=p->index;
 86                     break;
 87                 }
 88             }
 89             if(index==0&&Continue)
 90             return Insert(str);
 91              return index;
 92         }
 93         void ChangeContinue()
 94         {
 95             Continue=false;
 96         }
 97         int Insert(char *str)
 98         {
 99             Alphabet *temp;
100             temp=record;
101             p=new Alphabet;
102             strcpy(p->s,str);
103             p->index=cnt++;
104             p->next=NULL;
105             if(head==NULL)
106                 head=p;
107             else
108             temp->next=p;
109             return p->index;
110         }
111     private:
112         int oo;
113         int cnt,number;
114         Alphabet *p,*head,*record;
115         int maze[200][200];
116         int low[200],vis[200];
117         bool Continue;
118 };
119 int main()
120 {
121     int n,a,b,dis;
122     char s1[50],kep1[50];
123     char s2[50],kep2[50];
124     while(cin>>n&&n!=-1)
125     {
126         BUS bus(n);
127         scanf("%s %s",kep1,kep2);
128         for(int i=1;i<=n;i++)
129         {
130             scanf("%s %s %d",s1,s2,&dis);
131             bus.Command(s1,s2,dis);
132         }
133         bus.ChangeContinue();
134         a=bus.Deal(kep1);
135         b=bus.Deal(kep2);
136         if(!a||!b)
137         {
138             printf("-1\n");
139             continue;
140         }
141         if(strcmp(kep1,kep2)==0)
142         {
143             printf("0\n");
144             continue;
145         }
146         int result=bus.Dijkstra(a,b);
147         printf("%d\n",result);
148     }
149     return 0;
150 }

ACM2112迪克斯特算法

时间: 2024-11-03 20:46:59

ACM2112迪克斯特算法的相关文章

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第

转载:DenseNet算法详解

原文连接:http://blog.csdn.net/u014380165/article/details/75142664 参考连接:http://blog.csdn.net/u012938704/article/details/53468483 本文这里仅当学习笔记使用,具体细节建议前往原文细度. 论文:Densely Connected Convolutional Networks 论文链接:https://arxiv.org/pdf/1608.06993.pdf 代码的github链接:h

基于位置信息的聚类算法介绍及模型选择

百度百科 聚类:将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类.由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异."物以类聚,人以群分",在自然科学和社会科学中,存在着大量的分类问题.聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法.聚类分析起源于分类学,但是聚类不等于分类.聚类与分类的不同在于,聚类所要求划分的类是未知的. 分类和聚类算法一直以来都是数据挖掘,机器学习领域的热门课题,因此产生了众多的

密码算法详解——AES

0 AES简介 美国国家标准技术研究所在2001年发布了高级加密标准(AES).AES是一个对称分组密码算法,旨在取代DES成为广泛使用的标准. 根据使用的密码长度,AES最常见的有3种方案,用以适应不同的场景要求,分别是AES-128.AES-192和AES-256.本文主要对AES-128进行介绍,另外两种的思路基本一样,只是轮数会适当增加. 1 算法流程 AES加解密的流程图如下: AES加密过程涉及到4种操作:字节替代(SubBytes).行移位(ShiftRows).列混淆(MixCo

矩阵乘法的Strassen算法详解

题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积AB是一个m×p矩阵,它的一个元素其中 1 ≤ i ≤ m, 1 ≤ j ≤ p. 值得一提的是,矩阵乘法满足结合律和分配率,但并不满足交换律,如下图所示的这个例子,两个矩阵交换相乘后,结果变了: 下面咱们来具体解决这个矩阵相乘的问题. 解法一.暴力解法 其实,通过前面的分析

关于SVM数学细节逻辑的个人理解(三) :SMO算法理解

第三部分:SMO算法的个人理解 接下来的这部分我觉得是最难理解的?而且计算也是最难得,就是SMO算法. SMO算法就是帮助我们求解: s.t.   这个优化问题的. 虽然这个优化问题只剩下了α这一个变量,但是别忘了α是一个向量,有m个αi等着我们去优化,所以还是很麻烦,所以大神提出了SMO算法来解决这个优化问题. 关于SMO最好的资料还是论文<Sequential Minimal Optimization A Fast Algorithm for Training Support Vector

基于Spark MLlib平台的协同过滤算法---电影推荐系统

基于Spark MLlib平台的协同过滤算法---电影推荐系统 又好一阵子没有写文章了,阿弥陀佛...最近项目中要做理财推荐,所以,回过头来回顾一下协同过滤算法在推荐系统中的应用. 说到推荐系统,大家可能立马会想到协同过滤算法.本文基于Spark MLlib平台实现一个向用户推荐电影的简单应用.其中,主要包括三部分内容: 协同过滤算法概述 基于模型的协同过滤应用---电影推荐 实时推荐架构分析     一.协同过滤算法概述 本人对算法的研究,目前还不是很深入,这里简单的介绍下其工作原理. 通常,

算法 希尔排序

希尔排序 Shell Sort 介绍: 希尔排序(Shell Sort)也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高. 执行流程: 首先

算法 排序NB二人组 堆排序 归并排序

参考博客:基于python的七种经典排序算法     常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储存关系和对它们的操作方法.树形结构就像自然界的一颗树的构造一样,有一个根和若干个树枝和树叶.根或主干是第一层的,从主干长出的分枝是第二层的,一层一层直到最后,末端的没有分支的结点叫做叶子,所以树形结构是一个层次结构.在<数据结构>中,则用人类的血统关系来命名,一个结点的分枝叫做该结点的"