经过锦囊相助,海东集团终于度过了危机,从此,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 Hint: The best route is: xiasha->ShoppingCenterofHangZhou->supermarket->westlake 虽然偶尔会迷路,但是因为有了你的帮助 **和**从此还是过上了幸福的生活。 ――全剧终――
题解:用Dijkstra原始版本或者堆优化版本或者SPFA都能过,主要是将字符串映射为数字,还有就是注意当输入的起点等于终点时要优先输出0,否则会WAWAWAWA!!!
#include<bits/stdc++.h>
using namespace std;
map<string,int>mp;
int MAP[200][200];
const int INF=0x3f3f3f3f;
const int maxn=10020;
int n;
int vis[maxn],dis[maxn];
void Dijkstra(int s)
{
memset(dis,INF,sizeof(dis));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
dis[i]=MAP[s][i];
vis[s]=1;
for(int i=1;i<=n-1;i++)
{
int u,minn=INF;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]<minn)
{
minn=dis[j];
u=j;
}
}
vis[u]=1;
for(int v=1;v<=n;v++)
{
if(!vis[v]&&dis[v]>dis[u]+MAP[u][v])
dis[v]=dis[u]+MAP[u][v];
}
}
}
int main()
{
std::ios::sync_with_stdio(0);
int k;
while(cin>>k)
{
for(int i=1;i<=150;i++)
{
for(int j=1;j<=150;j++)
{
if(i==j)
MAP[i][j]=0;
else
MAP[i][j]=INF;
}
}
mp.clear();
if(k==-1)
break;
int flag=1;
string s1,s2;
cin>>s1>>s2;
if(s1==s2)
{
flag=0;
}
mp[s1]=1,mp[s2]=2;
n=2;
int x;
for(int i=1;i<=k;i++)
{
cin>>s1>>s2>>x;;
if(!mp[s1])
mp[s1]=++n;
if(!mp[s2])
mp[s2]=++n;
MAP[mp[s1]][mp[s2]]=MAP[mp[s2]][mp[s1]]=min(MAP[mp[s1]][mp[s2]],x);
}
Dijkstra(1);
if(flag==0)
cout<<"0"<<endl;
else if(dis[2]==INF)
cout<<"-1"<<endl;
else
cout<<dis[2]<<endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=100010;
map<string,int>mp;
typedef pair<int,int>Pi;
typedef pair<pair<int,int>,int>P;
struct Edge
{
int v,d,next;
} e[maxn*2];
struct node
{
int d,to;
bool operator < (const node &a)const
{
return a.d<d;
}
};
int head[maxn],vis[maxn],dis[maxn],cnt,n,m,s,t,a[maxn],b[maxn];
void add(int u,int v,int d)
{
e[cnt].v=v;
e[cnt].d=d;
e[cnt].next=head[u];
head[u]=cnt++;
}
void Init()
{
cnt=1;
memset(head,-1,sizeof(head));
}
void Dijkstra(int s)
{
memset(dis,INF,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[s]=0;
priority_queue<node>que;
que.push((node)
{
0,s
});
while(!que.empty())
{
node p=que.top();
que.pop();
int u=p.to;
if(vis[u])
continue;
vis[u]=1;
for(int i=head[u]; i!=-1; i=e[i].next)
{
int v=e[i].v;
int d=e[i].d;
if(dis[v]>dis[u]+d)
{
dis[v]=dis[u]+d;
if(vis[v])
continue;
que.push((node)
{
dis[v],v
});
}
}
}
}
void SPFA(int s)
{
memset(dis,INF,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[s]=0;
queue<int>que;
que.push(s);
while(!que.empty())
{
int u=que.front();
que.pop();
vis[u]=0;
for(int i=head[u]; i!=-1; i=e[i].next)
{
int v=e[i].v;
int d=e[i].d;
if(dis[v]>dis[u]+d)
{
dis[v]=dis[u]+d;
if(vis[v])
continue;
vis[v]=1;
que.push(v);
}
}
}
}
int main()
{
std::ios::sync_with_stdio(0);
while(cin>>n&&n!=-1)
{
Init();
int flag=1;
mp.clear();
string s1,s2;
cin>>s1>>s2;
if(s1==s2)
{
flag=0;
}
mp[s1]=1;
mp[s2]=2;
int top=2;
int x;
for(int i=1; i<=n; i++)
{
cin>>s1>>s2>>x;
if(!mp[s1])
mp[s1]=++top;
if(!mp[s2])
mp[s2]=++top;
add(mp[s1],mp[s2],x);
add(mp[s2],mp[s1],x);
}
//Dijkstra(1);
SPFA(1);
if(flag==0)
cout<<"0"<<endl;
else if(dis[2]==INF)
cout<<"-1"<<endl;
else
cout<<dis[2]<<endl;
}
return 0;
}