• <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 閱讀(2808) 評論(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?我試試看 我開始還以為是回收的效率很高呢...  回復  更多評論   

            很黄很污的网站久久mimi色| 久久久久久综合网天天| 久久综合久久综合久久| 国产—久久香蕉国产线看观看| 久久99精品九九九久久婷婷| 久久精品成人欧美大片| 久久99精品国产一区二区三区| 久久九九久精品国产免费直播| 久久天天躁狠狠躁夜夜躁2O2O| 国产精品热久久毛片| 国内精品人妻无码久久久影院| 久久噜噜久久久精品66| 久久w5ww成w人免费| 亚洲精品tv久久久久久久久| 久久无码精品一区二区三区| 丰满少妇人妻久久久久久| 亚洲а∨天堂久久精品| 久久996热精品xxxx| 国产国产成人精品久久| 麻豆亚洲AV永久无码精品久久| 无码人妻少妇久久中文字幕| 狠狠久久综合| 久久久WWW免费人成精品| 久久91亚洲人成电影网站| 久久精品国产99久久无毒不卡| 久久婷婷五月综合国产尤物app | 国内高清久久久久久| 久久久久黑人强伦姧人妻| 久久精品无码午夜福利理论片| 久久国产欧美日韩精品免费| 人人狠狠综合88综合久久| 国产亚洲精午夜久久久久久| 国产精品免费久久久久影院| 久久国产精品成人免费| 久久免费精品一区二区| 久久99热精品| 青青草国产精品久久| 91亚洲国产成人久久精品网址| 精品永久久福利一区二区 | 四虎国产精品免费久久久 | 中文字幕精品久久|