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

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

            POJ 1511-Invitation Cards(SPFA算法)

            今天終于用SPFA寫出了第一個(gè)程序,感覺收獲很大,從Dij到Floyed再到Bellmen,以及今天的SPFA,每一種算法背后都蘊(yùn)藏著許多值得思考的地方。正因?yàn)檠芯苛怂鼈儯攀沟梦业哪芰Σ粩嗟孬@得了提高。
            之前以為SPFA做為最短路問題最快的算法,想必代碼定不好寫,不過今天研究過才知道,SPFA的代碼量遠(yuǎn)遠(yuǎn)不及Dij,這著實(shí)令人驚嘆,原來最好的算法SPFA是如此的好寫,呵呵 我想此算法在很大程度上可以完全代替之前的算法,以后再碰到最短路問題時(shí),SPFA一定能成為首要的選擇!
            PS:由于是用鄰接表來存儲(chǔ)的,所以每次操作前要收回以前分配的內(nèi)存,我嘗試了收回和不收回兩種方法,發(fā)現(xiàn)其實(shí)差別不大,如果純粹是比賽的話,可能不收回反而會(huì)更好些(避免超時(shí))。當(dāng)然如果在實(shí)際應(yīng)用中,應(yīng)該切記內(nèi)存的分配,否則軟件可能會(huì)發(fā)生異常。

            //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];//此鄰接表用于存儲(chǔ)正向圖

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

            void initial(node edge[])//鄰接表的初始化,里面封裝了回收上一次操作所分配之內(nèi)存的操作
            {
                
            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()//每一個(gè)case的輸入函數(shù)
            {

                
            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)//如果隊(duì)列不空,則進(jìn)行松弛操作,直到隊(duì)列空為止
                {
                    
            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) 評(píng)論(2)  編輯 收藏 引用

            評(píng)論

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

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

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

            really?我試試看 我開始還以為是回收的效率很高呢...  回復(fù)  更多評(píng)論   


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久婷婷激情综合色综合俺也去| 久久久久亚洲av成人无码电影 | 精品水蜜桃久久久久久久| 欧美色综合久久久久久| 中文字幕乱码人妻无码久久| 91精品国产高清91久久久久久| 91秦先生久久久久久久| 亚洲欧美日韩久久精品第一区| 天天久久狠狠色综合| 亚洲精品无码久久久久去q| 国产成人无码精品久久久久免费 | 亚洲AV日韩精品久久久久久| 久久综合九色综合精品| 亚洲欧美伊人久久综合一区二区| 久久久久99精品成人片| 亚洲乱亚洲乱淫久久| 久久国产乱子伦免费精品| 久久亚洲中文字幕精品一区| 国产A级毛片久久久精品毛片| 精品无码久久久久久尤物| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 国产亚洲综合久久系列| 狠狠色狠狠色综合久久| 亚洲欧美一级久久精品| 久久夜色精品国产| 精品久久久久久久久久中文字幕| 久久久九九有精品国产| 久久香蕉超碰97国产精品 | 久久精品国产99久久香蕉| 国产午夜久久影院| 国产精品一区二区久久精品| 久久综合综合久久综合| 久久久久亚洲AV无码永不| 亚洲精品乱码久久久久久蜜桃图片 | 久久无码人妻一区二区三区午夜 | 97超级碰碰碰碰久久久久| 久久99精品国产一区二区三区| 久久精品www| 国产精品久久久天天影视香蕉 | 精品综合久久久久久88小说| 曰曰摸天天摸人人看久久久|