• <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国产精品尤物| 色偷偷91久久综合噜噜噜噜| 无码精品久久一区二区三区| 狠狠色狠狠色综合久久| 蜜桃麻豆www久久| 国产99久久久国产精品小说 | 亚洲精品99久久久久中文字幕| 久久精品国产亚洲AV不卡| 亚洲国产精品一区二区三区久久 | 久久妇女高潮几次MBA| 久久精品人人做人人爽电影蜜月| 女人香蕉久久**毛片精品| 一本色道久久88精品综合| 精品久久久久久无码免费| 久久精品a亚洲国产v高清不卡| 国产精品美女久久久网AV| 亚洲精品国精品久久99热一| 国产激情久久久久影院小草 | 亚洲精品国产成人99久久| 亚洲综合久久久| 久久久黄片| 99久久精品国产综合一区| 久久精品中文騷妇女内射| 亚洲成av人片不卡无码久久| 亚洲国产成人久久综合一| 久久亚洲国产成人精品性色| 国产成人久久精品一区二区三区 | 97超级碰碰碰久久久久| 2019久久久高清456| 久久婷婷五月综合97色直播| 品成人欧美大片久久国产欧美| 久久午夜伦鲁片免费无码| 无码久久精品国产亚洲Av影片| 2021国内久久精品| 国内精品久久久久影院亚洲| 久久精品女人天堂AV麻| 色婷婷久久综合中文久久一本| 国产日韩久久久精品影院首页| 青草影院天堂男人久久| 一级做a爰片久久毛片人呢|