ZJFC-1236

本文介绍了一种使用二叉堆、邻接表及DIJ算法实现简单的单源最短路径问题的方法。通过具体代码展示了如何构建图结构,并利用优先队列来寻找从起点到终点的最短路径。

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

 

  1#include<iostream>
  2#include <string>
  3#include <map>
  4#include<queue>
  5using namespace std;
  6
  7typedef struct
  8ExpandedBlockStart.gifContractedBlock.gif{
  9    long v,next,d;
 10}
edge;
 11
 12typedef struct node
 13ExpandedBlockStart.gifContractedBlock.gif{
 14    long v,d;
 15ExpandedSubBlockStart.gifContractedSubBlock.gif    node(long vv=0,long dd=0):v(vv),d(dd){}
 16}
node;
 17
 18bool operator <(const node &a,const node &b)
 19ExpandedBlockStart.gifContractedBlock.gif{
 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()
 33ExpandedBlockStart.gifContractedBlock.gif{
 34    long m;
 35    while (scanf("%ld",&m)!=EOF)
 36ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 37        long i,eid,sid,v1,v2;
 38        memset(p,-1,sizeof(p));
 39
 40        for (eid=sid=i=0;i<m;++i)
 41ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 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() )
 51ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 52                v1=M[F]=sid++;
 53            }

 54            else
 55ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 56                v1=M[F];
 57            }

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

 64            else
 65ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 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())
 89ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 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())
104ExpandedSubBlockStart.gifContractedSubBlock.gif        {
105            t=q.top();
106            q.pop();
107
108            if (t.v==v2)
109ExpandedSubBlockStart.gifContractedSubBlock.gif            {
110                break;
111            }

112
113            if (vist[t.v])
114ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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)
122ExpandedSubBlockStart.gifContractedSubBlock.gif            {
123                if (!vist[e[j].v])
124ExpandedSubBlockStart.gifContractedSubBlock.gif                {
125                    q.push(node(e[j].v,e[j].d+t.d));
126                }

127            }

128        }

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

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

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

143
144        M.clear();
145    }

146    return 0;
147}

148

转载于:https://www.cnblogs.com/zhuangli/archive/2008/07/25/1251287.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值