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

            T9的空間

            You will never walk alone!

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              69 隨筆 :: 0 文章 :: 28 評(píng)論 :: 0 Trackbacks

            網(wǎng)上看到的spfa的實(shí)現(xiàn),很清晰。Orz~~

            #include <cstdio>
            #include 
            <cstring>
            const int maxn = 10000+1;
            const int maxnm = 100000+1;
            class node 
            {
                  
            public:
                         
            int l,to;
                         node 
            * next;    
            }
            ;
            template
            <class T>
            class queue{
            private:
                
            long N;
                T
            * s;
                
            long beg,end;
            public:
                inline 
            void init(){
                 beg
            =end=0;
                }

                queue(
            long size):N(size),s(new T[size]){
                 init();
                }

                inline 
            void push(const T& item){
                 s[end]
            =item;
                 
            ++end;
                 end
            %=N;
                }

                inline T pop()
            {
                 T res
            =s[beg];
                 
            ++beg;
                 beg
            %=N;
                 
            return res;
                }

                inline 
            bool empty(){
                 
            return beg==end;
                }

            }
            ;

            node 
            *f[maxnm];
            int n,m,s,t,ans;
            int dist[maxn];
            bool p[maxn];//判斷點(diǎn)是否在隊(duì)列當(dāng)中
            inline void init()
            {
                    FILE 
            *fin = fopen("sssp.in","r");
                    
            int i,j,p1,p2,len;
                    node 
            *tp;
                    fscanf(fin,
            "%d%d",&n,&m);
                    
            for (i = 1 ; i <= m ; i++)
                    
            {
                           fscanf(fin,
            "%d%d%d",&p1,&p2,&len);
                           tp 
            = new node;
                           tp 
            -> l = len;
                           tp 
            -> to = p2; 
                           tp 
            -> next = f[p1];
                           f[p1] 
            = tp;                  
                    }
                
                    fscanf(fin,
            "%d%d",&s,&t);   
            }


            inline 
            void work()
            {
                     
            int i,j,k;
                     node 
            * tp;
                     queue 
            <int> que(n+1);
                     que.init();
                     memset(dist,
            126,sizeof(dist));
                     dist[s] 
            = 0;
                     que.push(s);
                     p[s] 
            = true;
                     
            do 
                     

                          i 
            = que.pop();
                          tp 
            = f[i];
                          p[i] 
            =    false;    //p[i] = false 表示i點(diǎn)不在隊(duì)列當(dāng)中
                          while (tp!=NULL)
                          
            {
                             
            if (dist[i]+tp->l<dist[tp->to])     
                                
            {
                                    dist[tp
            ->to] = dist[i]+tp->l;
                                    
            if (!p[tp->to])     //如果tp->to沒有在隊(duì)列當(dāng)中,那就將它加進(jìn)去
                                    {
                                       que.push(tp
            ->to);
                                       p[tp
            ->to] = true;
                                    }
             
                                }
                  
                                tp 
            = tp->next;
                          }
                     
                     }
            while (!que.empty());
                   
            }

            inline 
            void print()
            {
                    FILE 
            *fout = fopen("sssp.out","w");
                    fprintf(fout,
            "%d\n",dist[t]);       
            }

            int main()
            {
                    init();
                    work();
                    print();
                    
            return 0;    
            }



            還有一種實(shí)現(xiàn)方法用了STL的queue,構(gòu)圖的方法很好是一個(gè)一維的加一個(gè)p數(shù)組
            #include <iostream>
            #include 
            <queue>
            using namespace std;

            const long MAXN=10000;
            const long lmax=0x7FFFFFFF;

            typedef 
            struct  
            {
                
            long v;
                
            long next;
                
            long cost;
            }
            Edge;


            Edge e[MAXN];
            long p[MAXN];
            long Dis[MAXN];
            bool vist[MAXN];

            queue
            <long> q;

            long m,n;//點(diǎn),邊
            void init()
            {
                
            long i;
                
            long eid=0;

                memset(vist,
            0,sizeof(vist));
                memset(p,
            -1,sizeof(p));
                fill(Dis,Dis
            +MAXN,lmax);

                
            while (!q.empty())
                
            {
                    q.pop();
                }


                
            for (i=0;i<n;++i)
                
            {
                    
            long from,to,cost;
                    scanf(
            "%ld %ld %ld",&from,&to,&cost);

                    e[eid].next
            =p[from];
                    e[eid].v
            =to;
                    e[eid].cost
            =cost;
                    p[from]
            =eid++;

                    
            //以下適用于無(wú)向圖
                    swap(from,to);
                    
                    e[eid].next
            =p[from];
                    e[eid].v
            =to;
                    e[eid].cost
            =cost;
                    p[from]
            =eid++;

                }

            }


            void print(long End)
            {
                
            //若為lmax 則不可達(dá)
                printf("%ld\n",Dis[End]);    
            }


            void SPF()
            {

                init();

                
            long Start,End;
                scanf(
            "%ld %ld",&Start,&End);
                Dis[Start]
            =0;
                vist[Start]
            =true;
                q.push(Start);

                
            while (!q.empty())
                
            {
                    
            long t=q.front();
                    q.pop();
                    vist[t]
            =false;
                    
            long j;
                    
            for (j=p[t];j!=-1;j=e[j].next)
                    
            {
                        
            long w=e[j].cost;
                        
            if (w+Dis[t]<Dis[e[j].v])
                        
            {
                            Dis[e[j].v]
            =w+Dis[t];
                            
            if (!vist[e[j].v])
                            
            {
                                vist[e[j].v]
            =true;
                                q.push(e[j].v);
                            }

                        }

                    }

                }


                print(End);

            }


            int main()
            {
                
            while (scanf("%ld %ld",&m,&n)!=EOF)
                
            {
                    SPF();
                }

                
            return 0;
            }
            posted on 2008-09-11 17:01 Torres 閱讀(1091) 評(píng)論(2)  編輯 收藏 引用 所屬分類: Graph

            評(píng)論

            # re: SPFA (Shortest Path Faster Algorithm) 2009-03-26 19:29 xxx
            靜態(tài)與動(dòng)態(tài)區(qū)別,能不能把原地址貼出來(lái)  回復(fù)  更多評(píng)論
              

            # re: SPFA (Shortest Path Faster Algorithm) 2009-03-26 22:35 Torres
            源地址倒是忘了,搜搜吧,這個(gè)應(yīng)該容易理解的  回復(fù)  更多評(píng)論
              

            久久AV高清无码| 伊人色综合久久天天网 | 99久久无码一区人妻| 久久精品成人欧美大片| 欧美精品国产综合久久| 久久国产精品99久久久久久老狼 | 99久久免费只有精品国产| 亚洲国产精品无码久久青草| 久久久无码精品亚洲日韩按摩| 亚洲国产精品久久久久久| 狼狼综合久久久久综合网| 日韩AV毛片精品久久久| 亚洲一区中文字幕久久| 日韩精品无码久久久久久| 亚洲国产日韩欧美久久| 久久综合中文字幕| 久久人人爽人人爽人人片AV不| 久久久久久久综合狠狠综合| 久久国产精品免费一区二区三区| 亚洲中文字幕无码久久精品1| 久久久久亚洲AV成人网人人网站| 日本三级久久网| 精品久久久久久中文字幕| 伊人久久大香线蕉综合影院首页| 亚洲国产小视频精品久久久三级| 91亚洲国产成人久久精品| 久久综合丁香激情久久| 久久久91精品国产一区二区三区 | 亚洲国产精品综合久久一线| 精品久久久久中文字| 久久久久久毛片免费看| 久久久WWW成人免费精品| 久久久久国色AV免费看图片| 久久人妻少妇嫩草AV蜜桃| 亚洲国产精品成人久久蜜臀| 青青草国产97免久久费观看| 武侠古典久久婷婷狼人伊人| 麻豆久久久9性大片| 久久久久亚洲av无码专区导航| 久久人爽人人爽人人片AV| 婷婷久久综合九色综合98|