• <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++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              69 隨筆 :: 0 文章 :: 28 評論 :: 0 Trackbacks

            網上看到的spfa的實現,很清晰。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];//判斷點是否在隊列當中
            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點不在隊列當中
                          while (tp!=NULL)
                          
            {
                             
            if (dist[i]+tp->l<dist[tp->to])     
                                
            {
                                    dist[tp
            ->to] = dist[i]+tp->l;
                                    
            if (!p[tp->to])     //如果tp->to沒有在隊列當中,那就將它加進去
                                    {
                                       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;    
            }



            還有一種實現方法用了STL的queue,構圖的方法很好是一個一維的加一個p數組
            #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;//點,邊
            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++;

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

                }

            }


            void print(long End)
            {
                
            //若為lmax 則不可達
                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 閱讀(1087) 評論(2)  編輯 收藏 引用 所屬分類: Graph

            評論

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

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

            久久久WWW成人免费毛片| 国产高潮久久免费观看| 久久久精品国产亚洲成人满18免费网站| 中文成人久久久久影院免费观看| 久久久久亚洲AV片无码下载蜜桃| 精品熟女少妇AV免费久久| 热综合一本伊人久久精品| 亚洲中文久久精品无码| 狠狠色丁香久久综合婷婷| 日本国产精品久久| 蜜臀久久99精品久久久久久| 久久久亚洲欧洲日产国码aⅴ| 国产福利电影一区二区三区久久久久成人精品综合 | 久久久久久久精品成人热色戒| 怡红院日本一道日本久久| 亚洲精品99久久久久中文字幕| 久久精品中文字幕一区| 日本精品久久久久久久久免费| 伊人久久国产免费观看视频 | 岛国搬运www久久| 日本精品一区二区久久久| 欧美伊人久久大香线蕉综合| 成人精品一区二区久久久| 久久精品成人影院| 东方aⅴ免费观看久久av| AV无码久久久久不卡网站下载 | 88久久精品无码一区二区毛片 | 99国内精品久久久久久久| 久久无码一区二区三区少妇 | 浪潮AV色综合久久天堂| 国产精品成人久久久| 久久久噜噜噜久久熟女AA片 | 久久综合欧美成人| 狠狠色婷婷综合天天久久丁香 | 亚洲精品白浆高清久久久久久 | 久久国产一片免费观看| 亚洲色婷婷综合久久| 国产精品丝袜久久久久久不卡| 亚洲精品午夜国产va久久| 国产精品久久久久jk制服| 香蕉aa三级久久毛片|