hdu2112HDU Today

来源:互联网 发布:kmp算法next数组的含义 编辑:程序博客网 时间:2024/05/17 06:50

题目大意:

就是将所有公交站的站名和公交站之间的时间告诉你,要你求两个站之间所需要花费的最少的时间。其实本题还是一个最短路问题,不同之处就是站点是以字符串的形式给出的,可以用map存键值对的形式来解!

spfa求最短路,加优先级队列优化时间!

#include<stdio.h>#include<map>#include<string.h>#include<string>#include<queue>#include<vector>#define N 10009#define inf 1<<31-1using namespace std;struct node{   int dis;   int to;};int dis[N];struct cmp{  bool operator()(const int x,const int y)  {    return dis[x]>dis[y];  }};map<string ,int >v;vector<node>G[N];bool in_s[N];void spfa(int st,int n,int ed){     priority_queue<int,vector<int>,cmp>s;     int i,j,si,ui,di;     for(i=0;i<=n;i++){        dis[i]=inf;        in_s[i]=false;     }     s.push(st);     in_s[st]=true;     dis[st]=0;     while(!s.empty()){         si=s.top();         s.pop();         in_s[si]=false;         for(i=0;i<G[si].size();i++){                ui=G[si][i].to;                di=G[si][i].dis;                if(dis[ui]>dis[si]+di){                    dis[ui]=dis[si]+di;                    if(!in_s[ui]){                        s.push(ui);                        in_s[ui]=true;                    }                }         }     }}int main(){    char a[35],b[35];    int n,st,ed,vi,d,i,v1,v2;    node temp;    while(scanf("%d",&n)&&n!=-1){            vi=0;            v.clear();            for(i=0;i<=n;i++)                G[i].clear();            scanf("%s %s",a,b);            v[a]=++vi;st=vi;            if(v.find(b)==v.end()){                v[b]=++vi;ed=vi;            }else{               ed=v[b];            }    for(i=1;i<=n;i++){            scanf("%s %s %d",a,b,&d);        if(v.find(a)==v.end()){                v[a]=++vi;v1=vi;            }else{                v1=v[a];            }        if(v.find(b)==v.end()){                v[b]=++vi;v2=vi;            }else{                v2=v[b];            }            temp.dis=d;            temp.to=v2;            G[v1].push_back(temp);            temp.to=v1;            G[v2].push_back(temp);      }      spfa(st,vi,ed);           if(dis[ed]!=inf){        printf("%d\n",dis[ed]);      }else{         puts("-1");      } }}


0 0