• <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>

            之前本沙茶成功地在網絡流圖中搞出Dancing Link邊表,那么對于一般的圖,是否也能用Dancing Link邊表呢?答案是肯定的。

            邊類型(帶權的,不帶邊權的圖把len域去掉即可):
            struct edge {
                
            int a, b, len, pre, next;
            } ed[MAXM];
            初始化表頭:
            void init_d()
            {
                re(i, n) ed[i].a 
            = ed[i].pre = ed[i].next = i;
                
            if (n % 2) m = n + 1else m = n;
            }
            加邊(這里是加有向邊,如果加無向邊的話,再加一條邊<b, a, len>即可):
            void add_edge(int a, int b, int len)
            {
                ed[m].a 
            = a; ed[m].b = b; ed[m].len = len; ed[m].pre = ed[a].pre; ed[m].next = a; ed[a].pre = m; ed[ed[m].pre].next = m++;
            }
            在一般的圖中應用Dancing Link邊表的優勢:【1】能夠有效處理刪邊刪點問題;【2】在無向圖中,能夠很快找到一條邊對應的逆向邊;【3】最大的優勢是:如果要從某一條單點鏈表(其實整個邊表可以看成N個單點鏈表的并,N為圖中的點數)的中間開始遍歷,或者逆向遍歷整個表的話,一般的鄰接鏈表幾乎不可能完成,一般的邊表也很麻煩,這種Dancing Link邊表則可以很快搞定。不過它也有缺點:空間消耗比鄰接鏈表和一般邊表大一些(不過這個影響不大)。

            【應用實例】PKU1062(PKU上少有的中文題)
            很水的最短路問題。將每個物品當成一個點,若j可作為i的優惠品則連邊<i, j>,邊權為優惠價格,然后,枚舉等級限制(由于物品1是必須選的,因此設最大等級限制為lmt,物品1的等級為V,則可在[V-lmt, V]范圍內枚舉最低等級,最高等級就是(最低等級+lmt)),將所有不在等級限制內的點全部刪除(其實不用真刪除,只要設一個del數組避開它們即可),求從結點1到各結點的最短路,則min(dist[i]+cs[i])(dist[i]表示1到i的最短路,cs[i]表示直接購買物品i的價格)就是結果。
            代碼(2Y,一開始把solve里的g[j]弄成g[i]了囧……靜態查錯V5啊……神犇不要鄙視):
            #include <iostream>
            #include 
            <stdio.h>
            #include 
            <queue>
            #include 
            <utility>
            using namespace std;
            #define re(i, n) for (int i=0; i<n; i++)
            #define re3(i, l, r) for (int i=l; i<=r; i++)
            typedef pair 
            <intint> i_i;
            typedef priority_queue 
            <i_i, vector<i_i>, greater<i_i> > pqi_i;
            const int MAXN = 100, MAXM = 30000, INF = ~0U >> 2;
            struct edge {
                
            int a, b, len, pre, next;
            } ed[MAXM];
            int n, m, s, lmt, cs[MAXN], g[MAXN], dist[MAXN], res = INF;
            bool del[MAXN];
            pqi_i q;
            void init_d()
            {
                re(i, n) ed[i].a 
            = ed[i].pre = ed[i].next = i;
                
            if (n % 2) m = n + 1else m = n;
            }
            void add_edge(int a, int b, int len)
            {
                ed[m].a 
            = a; ed[m].b = b; ed[m].len = len; ed[m].pre = ed[a].pre; ed[m].next = a; ed[a].pre = m; ed[ed[m].pre].next = m++;
            }
            void init()
            {
                
            int b0, x, y;
                scanf(
            "%d%d"&lmt, &n);
                init_d();
                re(i, n) {
                    scanf(
            "%d%d%d"&cs[i], &g[i], &x);
                    re(j, x) {
                        scanf(
            "%d%d"&b0, &y);
                        add_edge(i, 
            --b0, y);
                    }
                }
            }
            void sol1()
            {
                re(i, n) 
            if (!del[i]) dist[i] = INF + 1; q.push(i_i(0, s));
                
            int i, j, d0, d1;
                
            while (!q.empty()) {
                    d0 
            = q.top().first; i = q.top().second; q.pop();
                    
            if (dist[i] == INF + 1) {
                        dist[i] 
            = d0;
                        
            for (int p=ed[i].next; p != i; p=ed[p].next) {
                            j 
            = ed[p].b;
                            
            if (!del[j]) {
                                d1 
            = d0 + ed[p].len; q.push(i_i(d1, j));
                            }
                        }
                    }
                }
                re(i, n) 
            if (!del[i]) {
                    d0 
            = cs[i] + dist[i];
                    
            if (d0 < res) res = d0;
                }
            }
            void solve()
            {
                
            int lf, rt; s = 0;
                re3(i, 
            0, lmt) {
                    lf 
            = g[s] - i; rt = lf + lmt;
                    re(j, n) del[j] 
            = g[j] < lf || g[j] > rt;
                    sol1();
                }
            }
            void pri()
            {
                printf(
            "%d\n", res);
            }
            int main()
            {
                init();
                solve();
                pri();
                
            return 0;
            }
            中文字幕热久久久久久久| 亚洲午夜精品久久久久久浪潮| 亚洲欧美日韩久久精品第一区| 欧洲性大片xxxxx久久久| 亚洲欧美国产日韩综合久久| 无码国内精品久久人妻| 国产成人精品久久一区二区三区av | 国产午夜福利精品久久| 91精品国产91久久久久福利| 久久久久久久综合日本| 久久国产精品无| 精品久久久久国产免费| 亚洲AV无码久久| 久久久久久久97| 久久久久亚洲av无码专区喷水| 久久国产视频网| 欧美精品一本久久男人的天堂| 久久无码国产专区精品| 久久精品国产久精国产| 久久国产精品99久久久久久老狼 | 久久久亚洲欧洲日产国码是AV| 精品久久久久久无码专区不卡| 色偷偷91久久综合噜噜噜噜| 国产精品久久久亚洲| 麻豆久久久9性大片| 久久久网中文字幕| 日韩亚洲欧美久久久www综合网| 亚洲国产另类久久久精品| 久久伊人五月天论坛| 色综合久久天天综合| 久久精品国产影库免费看| 久久久久久久97| 国产精品99久久免费观看| 国产情侣久久久久aⅴ免费| 久久精品人人做人人妻人人玩 | 久久只有这里有精品4| 污污内射久久一区二区欧美日韩| 国产精品无码久久久久| 国产精品免费久久久久影院| 99久久伊人精品综合观看| 91久久成人免费|