• <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>
            posts - 195,  comments - 30,  trackbacks - 0
            以后慢慢看
            ------------
            模板是HDOJ 2544
            我寫的是記錄每個點在堆中的位置IncreaseKey,也可以Relax后直接往里插,用個bool數組記錄一下

            -----
            優化之處在于時間復雜度由n^2變為nlgn
            -----
            #include<cstdio>
            #include<cstdlib>

            int n,m;
            int map[101][101],d[101];

            class Heap
            {
                public:
                    int handle[101];
                    void Build(int n)
                    {
                        for(int i=1;i<=n;i++) a[i]=handle[i]=i;
                        size=n;
                    }
                    void Percup(int p)
                    {
                        int temp=a[p];
                        for(;d[temp]<d[a[p>>1]];p>>=1)
                        {
                            a[p]=a[p>>1];
                            handle[a[p]]=p;
                        }
                        a[p]=temp;
                        handle[a[p]]=p;
                    }
                    int DeleteMin()
                    {
                        int val=a[1];
                        a[1]=a[size--];
                        Percdown(1);
                        handle[val]=0;
                        return val;
                    }
                    bool Empty() {return size==0;}
                private:
                    int a[101],size;
                    void Percdown(int p)
                    {
                        int temp=a[p],child;
                        for(;(p<<1)<=size;p=child)
                        {
                            child=p<<1;
                            if(child+1<=size && d[a[child+1]]<d[a[child]]) child++;
                            if(d[temp]<d[a[child]]) break;
                            a[p]=a[child];
                            handle[a[p]]=p;
                        }
                        a[p]=temp;
                        handle[a[p]]=p;
                    }
            }h;

            void init()
            {
                int i,j,c;
                for(i=1;i<=n;i++)
                {
                    for(j=1;j<=n;j++) map[i][j]=0x7fffffff;
                    d[i]=0x7fffffff;
                }
                d[1]=0;
                while(m--)
                {
                    scanf("%d%d%d",&i,&j,&c);
                    map[i][j]=map[j][i]=c;
                }
            }

            void Relax(int num)
            {
                for(int i=1;i<=n;i++)
                    if(h.handle[i] && map[num][i]!=0x7fffffff && d[i]>d[num]+map[num][i])
                    {
                        d[i]=d[num]+map[num][i];
                        h.Percup(h.handle[i]);
                    }
            }

            void dijk()
            {
                h.Build(n);
                while(!h.Empty()) Relax(h.DeleteMin());
            }

            int main()
            {
                while(scanf("%d%d",&n,&m) && n+m)
                {
                    init();
                    dijk();
                    printf("%d\n",d[n]);
                }
                system("pause");
                return 0;
            }
            ---------------------
            另一個版本
            #include <stdio.h>
            const int SIZE= 30005, MAXX=2000000000;
            int n,m,tail, dist[SIZE];
            bool mark[SIZE];
            struct Node
            {
            int id, val;
            Node* next;
            }node[SIZE];
            struct Heap{
            int id, val;
            }heap[2*SIZE];
            void insert(int a, int b, int val)
            {
            Node* p = new Node;
            p->id = a;
            p->val = val;
            p->next = node[b].next;
            node[b].next = p;
            }
            void heappush(int id, int val)
            {
            heap[++tail].id = id;
            heap[tail].val = val;
            int child, parent, temp;
            child = tail;
            while((parent = child/2)>=1)
            {
            if(heap[child].val < heap[parent].val) // child's val < parent's val ; swap ,filter
            {
            temp = heap[child].id;
            heap[child].id = heap[parent].id;
            heap[parent].id = temp;
            temp = heap[child].val;
            heap[child].val = heap[parent].val;
            heap[parent].val = temp;
            child = parent;
            }
            else
            break;
            }
            }
            int heappop()
            {
            int child, parent, temp,ret;
            ret = heap[1].id;
            heap[1].id = heap[tail].id; 
            // swap the tail to the root
            heap[1].val = heap[tail--].val;
            parent = 1;
            while((child=2*parent)<=tail)
            {
            if(child+1<=tail && heap[child+1].val < heap[child].val)
            child++;
            if(heap[child].val<heap[parent].val)
            {
            temp = heap[child].id;
            heap[child].id = heap[parent].id;
            heap[parent].id = temp;
            temp = heap[child].val;
            heap[child].val = heap[parent].val;
            heap[parent].val = temp;
            parent = child;
            }
            else
            break;
            }
            return ret;
            }
            int dijkstra(int s, int t)
            {
            int i;
            for(i=1; i<=n; i++)
            {
            dist[i] = MAXX;
            mark[i] = false;
            }
            Node* p;
            p = node[s].next;
            while(p)
            {
            dist[p->id] = p->val;
            heappush(p->id, p->val);
            p = p->next;
            }
            mark[s] = true; dist[s] = 0;
            for(i=1; i<n; i++)
            {
            int pop = heappop();
            while(mark[pop])
            pop = heappop();
            if(pop ==t || dist[pop]==MAXX)	break;
            mark[pop] = true;
            p = node[pop].next;
            while(p)
            {
            if(!mark[p->id]&&
            (dist[p->id]==MAXX || dist[pop]+p->val< dist[p->id]))
            {
            dist[p->id] = dist[pop] + p->val;
            heappush(p->id, dist[p->id]);
            }
            p = p->next;
            }
            }
            return dist[t];
            }
            int main()
            {
            int i,a,b,c;
            scanf("%d%d", &n, &m);
            for(i=1; i<=m; i++)
            {
            scanf("%d%d%d", &a, &b, &c);
            insert(a, b, c);
            }
            printf("%d\n", dijkstra(n,1));
            return 0;
            }
            
            posted on 2009-08-09 21:28 luis 閱讀(1794) 評論(0)  編輯 收藏 引用 所屬分類: 圖論*矩陣
            <2012年11月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久久综合九色合综国产| 人妻精品久久久久中文字幕69 | 久久国产色AV免费看| 亚洲国产精品一区二区久久| 久久精品青青草原伊人| 日韩AV无码久久一区二区| 亚洲乱亚洲乱淫久久| 看全色黄大色大片免费久久久| 亚洲va中文字幕无码久久不卡| 无码国内精品久久人妻麻豆按摩| 欧洲精品久久久av无码电影| 久久国产三级无码一区二区| 7国产欧美日韩综合天堂中文久久久久| 久久国产精品二国产精品| 久久e热在这里只有国产中文精品99 | 久久久久久精品无码人妻| 国产成人精品综合久久久| 久久精品无码午夜福利理论片| 狠狠久久综合| 久久噜噜电影你懂的| 久久综合国产乱子伦精品免费| 久久久免费观成人影院| 97超级碰碰碰碰久久久久| 久久久久人妻一区精品性色av| 亚洲欧美日韩精品久久亚洲区| 国产精品久久国产精麻豆99网站| 久久毛片一区二区| 亚洲国产小视频精品久久久三级 | 97久久香蕉国产线看观看| 欧美国产成人久久精品| 色欲久久久天天天综合网| 性高朝久久久久久久久久| 精品久久久久国产免费| 久久99毛片免费观看不卡| 色综合色天天久久婷婷基地| 国产成人综合久久综合| 99国产欧美精品久久久蜜芽| 91精品国产高清久久久久久io| 久久精品人成免费| 久久综合狠狠色综合伊人| 999久久久免费国产精品播放|