• <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 閱讀(2806) 評論(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久久久久| 香蕉久久夜色精品国产2020| 99久久这里只精品国产免费| 漂亮人妻被黑人久久精品| 99久久99久久精品国产| 亚洲色大成网站www久久九| 久久精品国产91久久综合麻豆自制| 伊人久久综合热线大杳蕉下载| 性做久久久久久久久老女人| 久久精品国产亚洲精品2020| 久久久无码精品亚洲日韩软件| 久久精品国产亚洲AV高清热| 色婷婷狠狠久久综合五月| 久久久精品人妻一区二区三区蜜桃| 久久精品国产精品亚洲艾草网美妙| 亚洲国产精品无码久久久蜜芽| 久久久不卡国产精品一区二区| 777米奇久久最新地址| 国产成人精品综合久久久久| 久久夜色精品国产www| 久久久久一区二区三区| 亚洲精品无码久久久久sm| 亚洲国产精品狼友中文久久久| 亚洲嫩草影院久久精品| 狠狠色婷婷久久一区二区三区| 久久久久久精品成人免费图片| 欧美久久久久久精选9999| 国产精品丝袜久久久久久不卡| 69久久夜色精品国产69| 久久国产亚洲精品无码| 欧美精品久久久久久久自慰| 一本色道久久综合亚洲精品| 亚洲中文字幕无码一久久区| 亚洲国产精品无码久久久秋霞2| 久久久国产精华液| 一本色道久久88—综合亚洲精品| 久久久无码精品亚洲日韩京东传媒 | 久久精品国产久精国产思思| 久久综合九色综合网站| 久久国产精品成人片免费|