HDU2112 HDU Today(最短路径)

来源:互联网 发布:手机电缆报价软件 编辑:程序博客网 时间:2024/05/17 02:24

   本题我是用优先队列优化的迪杰斯特拉算法,算作练手题。

   思路::基本算法,是dijstra算法,注意此题是无向图,题目中没有说明,起点到终点可能是同一个站,此时输出0,不能到达两地输出 -1 , 起点 –> 终点可能不存在公交车。

点击打开链接

#include <iostream>#include <string.h>#include <queue>#include <algorithm>using namespace std;char name[10009][200],str1[200],str2[200];int cnn,n,line,a,b,map[200][200],dis[200];struct sb{    int first,second;    bool operator<(const sb &t)const    {        if(first!=t.first)            return first>t.first;        else             return second>t.second;     }};int find(char *str){    int flag=0,i;    for(i=1;i<=cnn;i++)    {        if(!strcmp(name[i],str))        {            flag=1;            return i;            break;        }    }    if(!flag)    {        cnn++;        strcpy(name[cnn-1],str);        return cnn-1;    }}priority_queue<sb>q;int main(){    int i;    while(cin>>n)    {        memset(dis,9,sizeof(dis));        memset(map,-1,sizeof(map));        if(n==-1)            break;        cnn=1;        scanf("%s",name[cnn++]);        scanf("%s",name[cnn++]);        for(i=1;i<=n;i++)        {            cin>>str1>>str2>>line;            a=find(str1);            b=find(str2);            if(line<map[a][b]||map[a][b]<0)            {                map[a][b]=line;                map[b][a]=line;            }        }        if(!strcmp(name[1],name[2]))        {            cout<<0<<endl;            continue;        }        dis[1]=0;        sb e={dis[1],1};        q.push(e);        while(!q.empty())        {            e=q.top();            q.pop();            int x=e.second;            if(e.first!=dis[x])                continue;            for(i=1;i<cnn;i++)            {                if(map[x][i]>0&&dis[i]>dis[x]+map[x][i])                {                    dis[i]=dis[x]+map[x][i];                    sb e1={dis[i],i};                    q.push(e1);                }            }        }        if(dis[2]>10000000)        {            cout<<-1<<endl;            continue;        }        cout<<dis[2]<<endl;    }    return 0;}