题目:http://acm.hdu.edu.cn/showproblem.php?pid=2112
题意:输出从起始站到终点的最短时间。
想法:spfa。这道题给出的城市数小于150个,所以数组不用开太大。还有一点就是把城市名转化为序号标记起来,网上看说用map更简单,只有等晚上上课回来再搜一下map的用法了。
这道题一开始在输入时用得 cin 跑到了4980ms,吓死= =。改成scanf后是703ms,具体看代码
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int INF=1<<20;
const int maxn=155;
char sta[maxn][35];
bool vis[maxn];
int link[maxn][maxn],dis[maxn];
int n,t;
queue <int> ss;
void spfa(){
for(int i=1;i<=t;i++)
dis[i]=INF;
dis[1]=0;
memset(vis,false,sizeof(vis));
vis[1]=true;
ss.push(1);
while(!ss.empty()){
int x=ss.front();
ss.pop();
vis[x]=false;
for(int i=1;i<=t;i++){
if(link[x][i]!=INF){
if(dis[i]>dis[x]+link[x][i]){
dis[i]=dis[x]+link[x][i];
if(!vis[i]){
vis[i]=true;
ss.push(i);
}
}
}
}
}
if(dis[2]!=INF) cout<<dis[2]<<endl;
else cout<<"-1"<<endl;
}
int main(){
//freopen("123.txt","r",stdin);
while(scanf("%d",&n)&&n!=-1){
for(int i=1;i<=maxn;i++){
for(int j=1;j<=maxn;j++){
link[i][j]=INF;
}
}
cin>>sta[1]>>sta[2];
t=2;
char a[35],b[35];
for(int i=1;i<=n;i++){
int x,y,j,c;
scanf("%s%s%d",a,b,&c);//改成cin就是4980ms
for(j=1;j<=t;j++){
if(strcmp(a,sta[j])==0){
x=j;
break;
}
}
if(j>t){
strcpy(sta[++t],a);
x=t;
}
for(j=1;j<=t;j++){
if(strcmp(b,sta[j])==0){
y=j;
break;
}
}
if(j>t){
strcpy(sta[++t],b);
y=t;
}
if(link[x][y]>c){
link[x][y]=link[y][x]=c;
}
}
if(strcmp(sta[1],sta[2])==0) {
printf("0\n"); continue;
}
spfa();
}
return 0;
}