ZJFC-1236

简单的单源最短路径 使用二叉堆+邻接表+DIJ实现~~~

 

  1#include<iostream>
  2#include <string>
  3#include <map>
  4#include<queue>
  5using namespace std;
  6
  7typedef struct
  8{
  9    long v,next,d;
 10}
edge;
 11
 12typedef struct node
 13{
 14    long v,d;
 15    node(long vv=0,long dd=0):v(vv),d(dd){}
 16}
node;
 17
 18bool operator <(const node &a,const node &b)
 19{
 20    return a.d>b.d;
 21}

 22
 23char from[120],to[120];
 24map<string,long> M;
 25string F,T;
 26
 27edge e[200005];
 28long p[10005];
 29bool vist[10005];
 30priority_queue<node> q;
 31
 32int main()
 33{
 34    long m;
 35    while (scanf("%ld",&m)!=EOF)
 36    {
 37        long i,eid,sid,v1,v2;
 38        memset(p,-1,sizeof(p));
 39
 40        for (eid=sid=i=0;i<m;++i)
 41        {
 42            long cost;
 43            scanf("%s%s%ld",from,to,&cost);
 44            
 45        //    F=string(from);
 46        //    T=string(to);
 47            F=from;
 48            T=to;
 49
 50            if ( M.find(F)==M.end() )
 51            {
 52                v1=M[F]=sid++;
 53            }

 54            else
 55            {
 56                v1=M[F];
 57            }

 58
 59            
 60            if ( M.find(T)==M.end() )
 61            {
 62                v2=M[T]=sid++;
 63            }

 64            else
 65            {
 66                v2=M[T];
 67            }

 68
 69            e[eid].v=v1;
 70            e[eid].next=p[v2];
 71            e[eid].d=cost;
 72            p[v2]=eid++;
 73
 74            e[eid].v=v2;
 75            e[eid].next=p[v1];
 76            e[eid].d=cost;
 77            p[v1]=eid++;
 78
 79        }

 80
 81        scanf("%s%s",from,to);
 82//         F=string(from);
 83//         T=string(to);
 84        F=from;
 85        T=to;
 86
 87
 88        if (M.find(T)==M.end()||M.find(F)==M.end())
 89        {
 90            printf("It's a pity\n");
 91            continue;
 92        }

 93
 94        v1=M[F];
 95        v2=M[T];
 96
 97        
 98        q.push(node(v1,0));
 99
100        memset(vist,0,sizeof(vist));
101
102        node t;
103        while (!q.empty())
104        {
105            t=q.top();
106            q.pop();
107
108            if (t.v==v2)
109            {
110                break;
111            }

112
113            if (vist[t.v])
114            {
115                continue;
116            }

117
118            vist[t.v]=true;
119
120            long j;
121            for (j=p[t.v];j!=-1;j=e[j].next)
122            {
123                if (!vist[e[j].v])
124                {
125                    q.push(node(e[j].v,e[j].d+t.d));
126                }

127            }

128        }

129
130        if(t.v==v2)
131        {
132            printf("%ld\n",t.d);
133        }

134        else
135        {
136            printf("It's a pity\n");
137        }

138
139        while (!q.empty())
140        {
141            q.pop();
142        }

143
144        M.clear();
145    }

146    return 0;
147}

148
posted @ 2008-07-25 13:48  Hdu-Lost  阅读(406)  评论(0编辑  收藏  举报