• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            JulyRina's blog
            welcome to July Rina's blog
            posts - 22,comments - 1,trackbacks - 0
            題目大意:求圖上單點(diǎn)到單點(diǎn)之間的最短路。
            題目分析:之前我們?cè)谕坏绬?wèn)題上分析過(guò)了單源最短路問(wèn)題的Dijkstra算法
            使用鄰接矩陣實(shí)現(xiàn)的Dijkstra算法的時(shí)間復(fù)雜度是O(|V|^2)。使用鄰接表的話,更新最短距離只需要更新每一條邊即可,因此這部分的時(shí)間復(fù)雜度是O(|E|)。但是每次要枚舉所有的頂點(diǎn)來(lái)查找下一個(gè)使用的頂點(diǎn),因此最終復(fù)雜度還是O(|V|^2)。在|E|比較小時(shí),大部分經(jīng)歷放在了查找下一次要是用的頂點(diǎn)上,因此需要使用合適的數(shù)據(jù)結(jié)構(gòu)對(duì)其進(jìn)行優(yōu)化。
            需要優(yōu)化的是數(shù)值的插入(更新)和取出最小值兩個(gè)操作,因此使用堆就可以了。把每個(gè)頂點(diǎn)當(dāng)前的最短距離用堆維護(hù),在更新最短距離時(shí),把對(duì)應(yīng)的元素往根的方向移動(dòng)以滿足堆的性質(zhì)。而每次從堆中取出的最小值就是下一次要使用的頂點(diǎn)。這樣堆中元素共有O(|V|)個(gè),更新和取出數(shù)值的操作有O(|E|)次,因此整個(gè)算法的復(fù)雜度是O(|E|log(V))
            #include <cstdio>
            #include <iostream>
            #include <queue>
            #include <vector>
            using namespace std;
            #define INF (1<<29)
            const int maxn = 1010;

            typedef pair<intint> P; //first是最短距離,second是頂點(diǎn)的編號(hào)
            int V, dist[maxn];
            vector<P> G[maxn];

            void dijkstra(int s) {
                //通過(guò)指定greater<P>參數(shù),堆按照f(shuō)irst從小到大的順序取出值
                priority_queue<P, vector<P>, greater<P> > que;
                fill(dist, dist + V , INF);
                dist[s] = 0;
                while(!que.empty()) que.pop();
                que.push(P(0, s));
                while(!que.empty()) {
                    P p = que.top(); que.pop();
                    int u = p.second;
                    if(dist[u] < p.first) continue;
                    int sz = G[u].size();
                    for(int i=0;i<sz;i++) {
                        int to = G[u][i].second;
                        int cost = G[u][i].first;
                        if(dist[to] > dist[u] + cost) {
                            dist[to] = dist[u] + cost;
                            que.push(P(dist[to], to));
                        }
                    }
                }
            }

            int main() {
                int m;
                scanf("%d%d" , &m, &V);
                for(int i=0;i<V;i++) G[i].clear();
                for(int i=0;i<m;i++) {
                    int from, to, cost;
                    scanf("%d%d%d" , &from, &to, &cost);
                    from --; to --;
                    G[from].push_back(P(cost, to));
                    G[to].push_back(P(cost, from));
                }
                dijkstra(0);
                printf("%d\n", dist[V-1]);
                return 0;
            }
            posted on 2015-02-13 19:38 JulyRina 閱讀(328) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 解題報(bào)告
            亚洲国产成人久久精品99 | 久久久久97国产精华液好用吗| 久久天天躁狠狠躁夜夜2020一| 国产三级精品久久| 国产精品久久久久久福利69堂| 久久精品国产男包| 亚洲欧美一区二区三区久久| 久久午夜福利电影| 久久毛片免费看一区二区三区| 久久精品国产一区二区三区| 久久精品成人欧美大片| 国产精品99久久精品爆乳| 97超级碰碰碰碰久久久久| 国产叼嘿久久精品久久| 久久久久一本毛久久久| 理论片午午伦夜理片久久| 欧美大战日韩91综合一区婷婷久久青草| 国産精品久久久久久久| 久久人人爽人人精品视频| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区| 国产精品免费福利久久| 中文精品久久久久国产网址| 久久99精品国产麻豆婷婷| 日韩va亚洲va欧美va久久| 久久久久久久久66精品片| 亚洲色欲久久久久综合网| 精产国品久久一二三产区区别| 亚洲人成网亚洲欧洲无码久久 | 久久久久久久人妻无码中文字幕爆| 无码精品久久久天天影视| 99久久无码一区人妻a黑| 97精品国产97久久久久久免费 | 99久久99久久精品国产片果冻| 嫩草伊人久久精品少妇AV| 亚洲狠狠久久综合一区77777 | 中文精品99久久国产| 久久久久人妻精品一区| 久久亚洲欧洲国产综合| 久久久久久久亚洲Av无码| 亚洲国产成人精品女人久久久| 日本欧美久久久久免费播放网|