• <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
            題目大意:求圖上單點到單點之間的最短路。

            題目分析:單源最短路問題是固定一個起點,求它到其他所有點的最短路的問題。終點也固定問題叫做兩點之間最短路問題。但是因為單源最短路問題的復雜度是一樣的,因此通常當作單源最短路問題來求解。
            記從起點s出發到頂點i的最短距離為dist[i]。則下述等式成立。
            dist[i] = min{dist[j]+(從j到i的邊的權值)|e=(j,i)∈E}
            如果給定的圖是一個DAG,就可以按托不許給頂點編號,并利用這條遞推關系計算出dist。但是,如果圖中有圈,就無法利用這樣的關系進行計算。
            在這種情況下,記當前到頂點i的最短距離為dist[i],并設初值dist[s]=0,dist[i]=INF(足夠大的常數),再不斷使用這條地推關系式更新dist值,就可以算出新的dist。
            只要途中不存在負圈,這樣的更新操作就是有限的。結束之后的最短操作就是所求的最短距離了。
            #include <cstdio>
            #include <cstring>
            #include <iostream>
            #include <vector>
            using namespace std;
            #define INF (1<<29)
            const int maxn = 1010, maxm = 4040;

            int n, m;

            struct Edge { int from, to, cost; } edge[maxm];
            int V, E, dist[maxn];

            void bellman_ford(int s) {
                for(int i=0;i<V;i++) dist[i] = INF;
                dist[s] = 0;
                while(true) {
                    bool update = false;
                    for(int i=0;i<E;i++) {
                        Edge e = edge[i];
                        if(dist[e.from] != INF && dist[e.to] > dist[e.from] + e.cost) {
                            dist[e.to] = dist[e.from] + e.cost;
                            update = true;
                        }
                    }
                    if(!update) break;
                }
            }

            int main() {
                scanf("%d%d" , &m, &n);
                V = n; E = 2 * m;
                for(int i=0;i<E;i+=2) {
                    Edge e;
                    int from, to, cost;
                    scanf("%d%d%d" , &from, &to, &cost);
                    from --; to --;
                    edge[i].from = from;
                    edge[i].to = to;
                    edge[i].cost = cost;
                    edge[i+1].from = to;
                    edge[i+1].to = from;
                    edge[i+1].cost = cost;
                }
                bellman_ford(0);
                printf("%d", dist[n-1]);
                return 0;
            }
            這個算法叫做Bellman-Ford算法。如果在圖中不存在從s可達的負圈,那么最短路不會經過同一個頂點兩次(也就是說,最多通過|V|-1次),while(true)的循環最多經過|V|-1次,因此,復雜度是O(VE)。反之,如果存在從s可達的負圈,那么在第|V|次循環中也會更新dist的值,因此也可以用這個性質來檢查負圈。如果一開始對所有的i,都把dist[i]設為0,那么可以檢查出所有的負圈。
            bool find_negetive_loop() {
                memset(dist, 0, sizeof(dist));
                
                for(int i=0;i<V;i++) {
                    for(int j=0;j<E;j++) {
                        if(dist[e.to] > dist[e.from] + e.cost) {
                            dist[e.to] = dist[e.from] + e.cost;
                            if(i == V-1) return true;
                        }
                    }
                }
                return false;
            }
            posted on 2015-02-13 19:32 JulyRina 閱讀(232) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告
            久久久精品视频免费观看| 国产精品成人无码久久久久久| 亚洲精品无码久久毛片| 久久精品国产乱子伦| 婷婷五月深深久久精品| 久久亚洲国产精品一区二区| 久久亚洲中文字幕精品一区四| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久人妻少妇嫩草AV蜜桃| 99久久国产精品免费一区二区| 久久久久亚洲AV无码网站| 国内精品伊人久久久久影院对白| 精品国产日韩久久亚洲| 91精品无码久久久久久五月天| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 精品久久久无码21p发布| 久久午夜电影网| 伊人色综合久久天天人手人婷| 91精品国产高清久久久久久91| 中文字幕日本人妻久久久免费 | 九九久久99综合一区二区| 久久毛片一区二区| 久久精品免费大片国产大片| 无码精品久久久久久人妻中字| 久久精品无码av| 国产ww久久久久久久久久| 狠狠色婷婷综合天天久久丁香| 日日噜噜夜夜狠狠久久丁香五月 | 办公室久久精品| 欧美牲交A欧牲交aⅴ久久| 久久精品无码一区二区日韩AV| 久久久久综合网久久| 狠狠狠色丁香婷婷综合久久俺| 欧美丰满熟妇BBB久久久| 77777亚洲午夜久久多喷| 久久综合亚洲色一区二区三区| 欧美性猛交xxxx免费看久久久| 久久久久国产精品三级网| 久久精品国产国产精品四凭| 久久午夜福利电影| 欧美粉嫩小泬久久久久久久|