HDU 2112 HDU Today(dijkstra算法)
2016-05-12 20:29
411 查看
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
没考虑起点终点一样。。。
经过锦囊相助,海东集团终于度过了危机,从此,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
没考虑起点终点一样。。。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define INF 0x3f3f3f #define MAXN 1000 int n; int Edge[MAXN][MAXN];///邻接矩阵 int S[MAXN]; int dist[MAXN]; char a[31],b[31]; char d[MAXN][31]; void dijkstra(int v0) { int i,j,k; for(i=1; i<=n; i++) { dist[i]=Edge[v0][i]; S[i]=0; } dist[v0]=0; S[v0]=1;///顶点vo加入集合S for(i=0; i<n-1; i++)///从顶点V0确定n-1条最短路径 { int min=INF,u=v0; ///选择当前具有最短路径的顶点u for(j=1; j<=n; j++) { if(!S[j]&&dist[j]<min) { u=j; min=dist[j]; } } if(min==INF) continue; S[u]=1;///将顶点u加入到集合S,表示它的最短路经以求得。 ///修改dist数组的元素值 for(k=1; k<=n; k++) { if(!S[k]&&Edge[u][k]<INF&&dist[u]+Edge[u][k]<dist[k]) { dist[k]=dist[u]+Edge[u][k]; } } } } int main() { int m,i,j,c,a1,b1,k; while(~scanf("%d",&k)&&k!=-1) { getchar(); int flag=0; memset(Edge,0,sizeof(Edge)); scanf("%s%s",d[1],d[2]); if(strcmp(d[1],d[2])==0) { flag=1; } n=2; while(k--) { scanf("%s%s%d",&a,&b,&c); int flag1=1,flag2=1; for(int i=1; i<=n; i++) { if(strcmp(a,d[i])==0) { flag1=0; a1=i; break; } } if(flag1) { strcpy(d[n=n+1],a); a1=n; } for(int i=1; i<=n; i++) { if(strcmp(b,d[i])==0) { flag2=0; b1=i; break; } } if(flag2) { strcpy(d[n=n+1],b); b1=n; } Edge[a1][b1]=Edge[b1][a1]=c; } if(flag) { printf("0\n"); continue; } for(int i = 1; i <= n; i ++) for(int j = 1; j <= n; j ++) if(Edge[i][j]==0) Edge[i][j]= INF; dijkstra(1); if(dist[2]>=INF) printf("-1\n"); else printf("%d\n",dist[2]); } return 0; }
相关文章推荐
- 爬楼梯算法备份
- [转]Android Context应用上下文详解
- Android开发 状态栏沉浸
- 战略游戏
- Spark入门
- windows下nginx安装、配置与使用(转载)
- 20160510--hibernate懒加载问题
- 5.12 操作系统——进程调度
- 玩一把tesseract
- 大数据作业01
- Seam Carving代码
- jdk8环境变量 jdk8图解安装 java8安装
- Ubuntu下搭建mysql搭建主从配置
- 实验三-进程模拟调度
- LeetCode Two Sum
- Unity3D 性能优化
- Python的GIL是什么鬼,多线程性能究竟如何
- poj 2536 Gopher II 最大匹配
- poj 2456 Aggressive cows(二分搜素)
- 51单片机定时器精度问题之一