HDU Today HDU杭电2112【Dijkstra || SPFA】

来源:互联网 发布:U盘品牌 知乎 编辑:程序博客网 时间:2024/05/17 00:55

http://acm.hdu.edu.cn/showproblem.php?pid=2112
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
6xiasha westlakexiasha station 60xiasha ShoppingCenterofHangZhou 30station westlake 20ShoppingCenterofHangZhou supermarket 10xiasha supermarket 50supermarket westlake 10-1
 

Sample Output
50Hint:The best route is:xiasha->ShoppingCenterofHangZhou->supermarket->westlake虽然偶尔会迷路,但是因为有了你的帮助**和**从此还是过上了幸福的生活。――全剧终――
 



#include<stdio.h>#include<string.h>#include<string>#include<map>#define INF 0x3f3f3f3f#define N 110using namespace std;int Map[N][N];int dis[10100];bool used[10100];int n;int i,j;void dijkstra(int u){memset(used,0,sizeof(used));memset(dis,INF,sizeof(dis));int pos=u;for(i=1;i<=100;++i)//第一次给dis赋值 {dis[i]=Map[u][i];}dis[u]=0;used[u]=1;for(i=1;i<100;++i)//最多运行一百次,因为最多有一百个公交车站{int min=INF;for(j=1;j<=100;++j){if(!used[j]&&dis[j]<min){min=dis[j];pos=j;}} used[pos]=1;dis[pos]=min;for(j=1;j<=100;++j)//把dis数组更新,也叫松弛{if(!used[j]&&dis[j]>Map[pos][j]+dis[pos]){dis[j]=Map[pos][j]+dis[pos];}}}}int main(){int m;int u,v,w;char s1[50],s2[50];while(scanf("%d",&n),n!=-1){for(i=1;i<=100;++i)      for(j=1;j<=i;++j)        Map[i][j]=Map[j][i]=INF;        map<string,int>mp;                scanf("%s%s",s1,s2);        bool flag=0;        if(strcmp(s1,s2)==0) flag=1;        mp[s1]=1;        mp[s2]=2;int num=3;     while(n--){scanf("%s%s%d",s1,s2,&w);if(!mp[s1]) mp[s1]=num++;//如果没用过 if(!mp[s2]) mp[s2]=num++;Map[mp[s1]][mp[s2]]=Map[mp[s2]][mp[s1]]=w;}if(flag) printf("0\n");else{dijkstra(1);if(dis[2]==INF) printf("-1\n");else printf("%d\n",dis[2]);}}return 0;}

//SPFA

#include <cstdio>#include <cstring>#include <string>#include <iostream>#include <map>#include<queue>#define M 300#define INF 0x3f3f3f3fusing namespace std;int Map[M][M];int s=0, e=1;int low[10010];bool vis[10010];void SPFA(){int i, j;queue<int> Q;memset(low, INF, sizeof(low)); memset(vis, 0, sizeof(vis));vis[1] = 1;low[1] = 0;Q.push(1);while(!Q.empty()){int u = Q.front();Q.pop();vis[u] = 0;//出队列了,不在队列就变成0 for(i = 1; i <= 100; ++i){if(low[i] > low[u] + Map[u][i]){low[i] = low[u] + Map[u][i];if(!vis[i])  { vis[i]=1; Q.push(i); }}}}if(low[2] == INF) printf("-1\n");else printf("%d\n",low[2]);}int main(){int N;char s1[40], s2[40];int u, v, w;while(scanf("%d",&N) && N != -1){map<string,int>mp;int flag=0;for(int i=1;i<=100;++i)for(int j=1;j<=i;++j)Map[i][j]=Map[j][i]=INF;scanf("%s%s",s1,s2);if(strcmp(s1,s2)==0) flag=1;mp[s1]=1;mp[s2]=2;int num=3;while(N--){scanf("%s%s%d",s1,s2,&w);if(!mp[s1]) mp[s1]=num++;if(!mp[s2]) mp[s2]=num++;Map[mp[s1]][mp[s2]]=Map[mp[s2]][mp[s1]]=w;}if(flag){printf("0\n");continue;}SPFA();}return 0;}/*6xiasha xiashaxiasha station 60xiasha ShoppingCenterofHangZhou 30station westlake 20ShoppingCenterofHangZhou supermarket 10xiasha supermarket 50supermarket westlake 100*/


0 0
原创粉丝点击