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

            The Fourth Dimension Space

            枯葉北風寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢令

            POJ 1511-Invitation Cards(SPFA算法)

            今天終于用SPFA寫出了第一個程序,感覺收獲很大,從Dij到Floyed再到Bellmen,以及今天的SPFA,每一種算法背后都蘊藏著許多值得思考的地方。正因為研究了它們,才使得我的能力不斷地獲得了提高。
            之前以為SPFA做為最短路問題最快的算法,想必代碼定不好寫,不過今天研究過才知道,SPFA的代碼量遠遠不及Dij,這著實令人驚嘆,原來最好的算法SPFA是如此的好寫,呵呵 我想此算法在很大程度上可以完全代替之前的算法,以后再碰到最短路問題時,SPFA一定能成為首要的選擇!
            PS:由于是用鄰接表來存儲的,所以每次操作前要收回以前分配的內存,我嘗試了收回和不收回兩種方法,發現其實差別不大,如果純粹是比賽的話,可能不收回反而會更好些(避免超時)。當然如果在實際應用中,應該切記內存的分配,否則軟件可能會發生異常。

            //Coded by abilitytao 
            //Time:2009-04-10 22:49:58
            #include<iostream>
            #include
            <cmath>
            #include
            <queue>
            using namespace std;
            #define MAX_NUM 1000000001
            #define MAX_DOTNUM 1000001

            int n,m;
            queue
            <int>myqueue;
            bool mark[MAX_DOTNUM];
            __int64 dis[MAX_DOTNUM];


            struct node
            {

                
            int v;
                
            int w;
                node 
            *next;
            }
            edge[MAX_DOTNUM];//此鄰接表用于存儲正向圖

            node reversed_edge[MAX_DOTNUM];
            //此逆鄰接表用于存儲逆向圖

            void initial(node edge[])//鄰接表的初始化,里面封裝了回收上一次操作所分配之內存的操作
            {
                
            int i;
                node 
            *p;
                node 
            *q;
                
            for(i=1;i<=n;i++)
                
            {
                    p
            =&edge[i];
                    q
            =p->next;
                    
            while(q!=NULL)
                    
            {
                        p
            ->next=q->next;
                        delete q;
                        q
            =p->next;
                    }

                }

            }



            void input_case()//每一個case的輸入函數
            {

                
            int i;
                
            for(i=1;i<=m;i++)
                
            {
                    node 
            *p;
                    node 
            *q;
                    
            int a,b,c;
                    scanf(
            "%d%d%d",&a,&b,&c);
                    
            ////////////////////////
                    p=&edge[a];
                    q
            =new node;
                    q
            ->v=b;
                    q
            ->w=c;
                    q
            ->next=p->next;
                    p
            ->next=q;
                    
            ////////////////////////
                    p=&reversed_edge[b];
                    q
            =new node;
                    q
            ->v=a;
                    q
            ->w=c;
                    q
            ->next=p->next;
                    p
            ->next=q;
                }

            }



            void spfa(node edge[])//SPFA部分
            {

                
            int i;
                
            ///////////////////////////////////////////////////////////////
                memset(mark,false,sizeof(mark));
                
            for(i=1;i<=n;i++)
                    dis[i]
            =MAX_NUM;
                
            while(myqueue.size()!=0)
                    myqueue.pop();
                
            ///////////////////////////////////////////////////////////
                dis[1]=0;
                mark[
            1]=true;
                myqueue.push(
            1);
                
            while(myqueue.size()!=0)//如果隊列不空,則進行松弛操作,直到隊列空為止
                {
                    
            int temp=myqueue.front();
                    myqueue.pop();
                    mark[temp]
            =false;
                    node 
            *p;
                    
            for(p=edge[temp].next;p!=NULL;p=p->next)
                    
            {
                        
            if(dis[p->v]>dis[temp]+p->w)
                        
            {
                            dis[p
            ->v]=dis[temp]+p->w;
                            
            if(mark[p->v]!=true)
                            
            {
                                myqueue.push(p
            ->v);
                                mark[p
            ->v]=true;
                            }

                        }

                    }

                }

            }



            int main()
            {

                
            int testcase;
                
            int i,j;
                __int64 sum;
                scanf(
            "%d",&testcase);
                
            for(i=1;i<=MAX_DOTNUM-1;i++)
                
            {
                    edge[i].v
            =i;
                    edge[i].w
            =0;
                    edge[i].next
            =NULL;
                }

                
            for(i=1;i<=MAX_DOTNUM-1;i++)
                
            {
                    reversed_edge[i].v
            =i;
                    reversed_edge[i].w
            =0;
                    reversed_edge[i].next
            =NULL;
                }

                
            for(i=1;i<=testcase;i++)
                
            {
                    sum
            =0;
                    scanf(
            "%d%d",&n,&m);
                    initial(edge);
                    initial(reversed_edge);
                    input_case();
                    spfa(edge);
                    
            for(j=1;j<=n;j++)
                        sum
            +=dis[j];
                    spfa(reversed_edge);
                    
            for(j=1;j<=n;j++)
                        sum
            +=dis[j];
                    printf(
            "%I64d\n",sum);
                }

                system(
            "pause");
                
            return 0;

            }


            posted on 2009-04-11 00:51 abilitytao 閱讀(2805) 評論(2)  編輯 收藏 引用

            評論

            # re: POJ 1511-Invitation Cards(SPFA算法) 2009-04-12 12:25 lzmagic

            嘿嘿,寫得真不錯,我的用STL超時了~
            貌似把
            initial(edge);
            initial(reversed_edge);
            這兩句放到
            printf("%I64d\n",sum);
            后面去會超時,也許是最后一句數據釋放要很久……  回復  更多評論   

            # re: POJ 1511-Invitation Cards(SPFA算法) 2009-04-14 16:09 abilitytao

            really?我試試看 我開始還以為是回收的效率很高呢...  回復  更多評論   

            99久久精品无码一区二区毛片| 伊人久久成人成综合网222| 国产毛片欧美毛片久久久| 少妇内射兰兰久久| 伊人热人久久中文字幕| 久久久久久曰本AV免费免费| 三级三级久久三级久久| 久久se精品一区精品二区| 久久久噜噜噜久久| 久久99精品国产一区二区三区| 久久国产精品波多野结衣AV| 免费精品久久天干天干| 国产ww久久久久久久久久| 综合久久给合久久狠狠狠97色| 精品无码久久久久久尤物| 久久久久亚洲AV综合波多野结衣 | 污污内射久久一区二区欧美日韩| 亚洲国产欧洲综合997久久| 久久国产成人午夜aⅴ影院| 久久av无码专区亚洲av桃花岛| 久久精品国产精品亚洲人人| 国产精品一区二区久久国产| 中文国产成人精品久久不卡| 久久99国产精品成人欧美| 久久精品国产99国产精偷| 人人狠狠综合久久88成人| 国产成人综合久久精品红| 国内精品欧美久久精品| 国内精品久久九九国产精品| 欧美精品久久久久久久自慰| 亚洲中文字幕无码久久精品1| 久久中文精品无码中文字幕| 国产成人精品久久综合| 99久久免费国产精品热| 国内精品九九久久久精品| 亚洲中文字幕久久精品无码喷水| 亚洲午夜久久久| 久久九九久精品国产免费直播| 日韩一区二区三区视频久久| 污污内射久久一区二区欧美日韩| 香蕉久久影院|