Hduoj2112【字典树+迪杰斯特拉】
来源:互联网 发布:eterm模拟软件 编辑:程序博客网 时间:2024/06/05 20:28
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#define MAX 100000000struct bus{ int id; bus * next[54];}root;int busid, dis[155][155], d[155], n;int getid(char *s){ int i, j, k, l; bus *p = &root, *q; l = strlen(s); for(i = 0; i < l; ++i) { if(s[i] >= 97 && s[i] <= 122) k = s[i] - 'a'; else { k = s[i] - 'A'; k += 26; } if(p->next[k] == NULL) { q = (bus *)malloc(sizeof(root)); for(j = 0; j < 54; ++j) q->next[j] = NULL; q->id = 0; p->next[k] = q; p = q; } else p = p->next[k]; } if(p->id == 0) p->id = ++busid; return p->id;}void dij(){ int i, j, k, vis[200] = {0}; vis[1] = 1; for(i = 1; i <= busid; ++i) d[i] = dis[1][i]; for(i = 1; i < busid; ++i) { int min = MAX; k = 0; for(j = 1; j <= busid; ++j) { if( !vis[j] && d[j] < min) { min = d[j]; k = j; } } if(k == 0 ) return ; vis[k] = 1; for(j = 1; j <= busid; ++j) { if(!vis[j] && dis[k][j] < MAX && d[j] > d[k] + dis[k][j]) d[j] = d[k] + dis[k][j]; } }}int main(){ int i, j, k; char s1[35], e1[35]; while(scanf("%d", &n) != EOF)//输入n { if(n == -1) break; for(i = 1; i <= 151; ++i)//初始化 for(j = 1; j <= 151; ++j) { if(j != i) dis[i][j] = MAX; else dis[i][j] = 0; } busid = 0;//车站个数 scanf("%s%s", s1, e1);//输入起点和终点 int ok = 0;//标记起点和终点是否相同 if(strcmp(s1, e1) == 0) ok = 1; for(i = 0; i < 54; ++i) root.next[i] = NULL; getid(s1);//将起点的编号为1 getid(e1);//终点编号为2 for(i = 0; i < n; ++i) { int temp; scanf("%s%s %d", s1, e1, &temp); j = getid(s1); k = getid(e1); if(temp < dis[j][k])//重复选取最短的时间 dis[j][k] = dis[k][j] = temp; getchar(); } if(ok) { printf("0\n"); continue; } dij(); if(d[2] == MAX) printf("-1\n"); else printf("%d\n", d[2]); } return 0;}
题意:题意很明显。
思路:这里用字典树对每个车站进行编号,然后记录路径长度,最后用迪杰斯特拉求出最短的路径,这里要注意的是起点和终点有可能是一样的输出0,其次就是车站起点和终点可以互换。
0 0
- Hduoj2112【字典树+迪杰斯特拉】
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树。。
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- 字典树
- OpenFire源码学习之十五:插件开发
- 图片缩放时java.lang.IllegalArgumentException: pointerIndex out of range
- 面试小结-那些求职路上的经验分享与感受
- 字符串的一些算法
- oracle数据库使用dgbroker搭建DG以及一些常见的小问题
- Hduoj2112【字典树+迪杰斯特拉】
- OpenCV: 寻找图像轮廓并绘制
- Memcache和redis的区别及选择
- Aerospike-Architecture系列之次索引
- 【c++】实现一个类
- 【OpenCV入门教程之二】 一览众山小:OpenCV 2.4.8 or OpenCV 2.4.9组件结构全解析
- iOS 小技巧之-Zombie Enable
- 还原TexturePacker plist 文件以及图片的方法 (切开各小图片)
- JAVA webservice之CXF