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

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

            #

            淺究初等數(shù)論之中國剩余定理(Chinese Remainder Theorem)

             推論1:方程ax=b(mod n)對于未知量x有解,當且僅當gcd(a,n) | b。
             推論2:方程ax=b(mod n)或者對模n有d個不同的解,其中d=gcd(a,n),或者無解。
             定理1:設(shè)d=gcd(a,n),假定對整數(shù)x和y滿足d=ax+by(比如用擴展Euclid算法求出的一組解)。如果d | b,則方程ax=b(mod n)有一個解x0滿足x0=x*(b/d) mod n 。特別的設(shè)e=x0+n,方程ax=b(mod n)的最小整數(shù)解x1=e mod (n/d),最大整數(shù)解x2=x1+(d-1)*(n/d)。
             定理2:假設(shè)方程ax=b(mod n)有解,且x0是方程的任意一個解,則該方程對模n恰有d個不同的解(d=gcd(a,n)),分別為:xi=x0+i*(n/d) mod n 。


            證明過程請詳見 《算法導論》

                #include<iostream>
            #include
            <algorithm>
            #include
            <cmath>
            #include
            <cstdio>
            using namespace std;

            int EXTENDED_EUCLID(int a,int b,int &x,int &y)//擴展歐幾里德算法
            {
                
            if(b==0)
                
            {
                    x
            =1;
                    y
            =0;
                    
            return a;
                }

                
            int r=EXTENDED_EUCLID(b,a%b,x,y);
                
            int temp=x;
                x
            =y;
                y
            =temp-a/b*y;
                
            return r;
            }


            int  MODULAR_LINEAR(int a,int b,int n)//求解模線性方程
            {
                
            int d,x,y;
                
            int x0;
                d
            =EXTENDED_EUCLID(a,n,x,y);
                x0
            =(x*(b/d)+n)%n;
                
            return x0;
            }

            //當時魚頭讓我們研究的時候,沒有考慮得太仔細,上面的方程只能求出一個可行解
            //而下面的函數(shù)能夠求出最小的整數(shù)解,甚至在模n內(nèi)任意的解
            long long  MODULAR_LINEAR(long long a,long long b,long long n)//求解模線性方程
            {
                
            long long d,x,y;
                
            long long x0;
                d
            =EXTENDED_EUCLID(a,n,x,y);
                
            if(b%d)
                    
            return -1;
                x0
            =(x*(b/d))%n+n;//確保是正數(shù)
                x0%=(n/d);//x0是第一個大于0的整數(shù)解
                return x0;
            }


            int CHINESE_RESIDUE_THEOREM(int n[],int b[],int k)//求解模線性方程組,所有數(shù)據(jù)從1號下標開始存儲
            {

                
            int result=0;
                
            int i;
                
            int N=1;
                
            int *m=new int [k+1];
                
            int *reversem=new int [k+1];
                
            int sum=0;
                
            for(i=1;i<=k;i++)
                
            {
                    N
            *=n[i];
                }

                
            for(i=1;i<=k;i++)
                
            {

                    m[i]
            =N/n[i];
                    reversem[i]
            =MODULAR_LINEAR(m[i],1,n[i]);
                    sum
            +=m[i]*reversem[i]*b[i];
                }

                result
            =sum%N;
                
            return result;
            }



            int main ()
            {

                
            int num;
                
            int i;
                printf(
            "參考格式:X mod n[i] = b[i]\n");
                cout
            <<"請輸入方程的個數(shù):";
                cin
            >>num;
                
            int *n=new int [num+1];
                
            int *b=new int [num+1];
                
            for(i=1;i<=num;i++)
                
            {

                    cout
            <<"請輸入第"<<i<<"個方程的n和b:";
                    cin
            >>n[i]>>b[i];
                }

                
            int result=CHINESE_RESIDUE_THEOREM(n,b,num);
                cout
            <<"解為:";
                cout
            <<result<<endl;
                cout
            <<"謝謝你的使用"<<endl;
                system(
            "pause");
                
            return 0;
            }

            posted @ 2009-04-08 01:15 abilitytao 閱讀(1630) | 評論 (0)編輯 收藏

            POJ 2996-Help Me with the Game(模擬題)

                 摘要: 這道題直接模擬就好了,不過我有一點不明白的是,確定棋子的位置時兩次的搜索順序為什么不同?如果說要考慮玩家的視角的話,為什么輸出的格式還是一樣的呢?呵呵。值得一提的是:為了模擬這道題,我把所有的步驟分布來寫了。1.初步讀入數(shù)據(jù),略去棋盤框架(input);2.精確讀入棋盤點每個棋子的信息,過濾(filter);3.搜索(read)4.輸出(print)不過值得注意的是:這樣寫代碼會很長,看來怎么縮短...  閱讀全文

            posted @ 2009-04-04 23:27 abilitytao 閱讀(478) | 評論 (0)編輯 收藏

            POJ 2643-Election(map容器水之)

            這道題的大意是:
            有n個黨派,每個黨派有一位主席,現(xiàn)在選舉國家領(lǐng)導人,m個人投票,看看獲勝的是那個黨或者是個人;
            PS:題目里沒說清楚,就是每個黨派只有一個候選人,這個要注意下,其它的沒什么好說的了,此題不難。
            #include<iostream>
            #include
            <cmath>
            #include
            <string>
            #include
            <algorithm>
            #include
            <map>
            using namespace std;

            map
            <string,string>mymap_party;
            map
            <int,string>mymap_name;
            map
            <string,int>mymap_index;

            int votenum[1000000];

            int main()
            {
                
            int i;
                
            int n,m;
                memset(votenum,
            0,sizeof(votenum));
                scanf(
            "%d",&n);
                cin.ignore();
                
            for(i=1;i<=n;i++)
                
            {
                    
            string temp1;
                    
            string temp2;
                    getline(cin,temp1);
                    getline(cin,temp2);
                    mymap_party[temp1]
            =temp2;
                    mymap_name[i]
            =temp1;
                    mymap_index[temp1]
            =i;
                }

                scanf(
            "%d",&m);
                cin.ignore();
                
            for(i=1;i<=m;i++)
                
            {

                    
            string temp;
                    getline(cin,temp);
                    votenum[mymap_index[temp]]
            ++;
                }

                
            int max=0;
                
            int maxmark=0;
                
            int secmax=0;
                
            for(i=1;i<=n;i++)
                
            {

                    
            if(votenum[i]>max)
                    
            {
                        secmax
            =max;
                        max
            =votenum[i];
                        maxmark
            =i;
                    }

                    
            else if(votenum[i]>secmax)
                    
            {
                        secmax
            =votenum[i];
                    }

                }

                
            string test("independent");
                
            if(max==secmax)
                    printf(
            "tie\n");
                
            else if(max!=secmax&&mymap_party[mymap_name[maxmark]]==test)
                    cout
            <<mymap_name[maxmark]<<endl;
                
            else 
                    cout
            <<mymap_party[mymap_name[maxmark]]<<endl;
                system(
            "pause");


                
            return 0;

            }









            posted @ 2009-04-04 17:12 abilitytao 閱讀(395) | 評論 (0)編輯 收藏

            POJ 1093-Sorting It All Out(早知道不用拓撲排序了。。。)

                 摘要: 剛上完數(shù)據(jù)結(jié)構(gòu)課,想練習一下鄰接表以及拓撲排序,于是找到了這道題,沒想到這道題遠遠不止拓撲排序這么簡單,汗~PS:這道題用拓撲排序要特別注意,當度為零的點>1時,要判斷圖中是否有環(huán)。我就是錯在這里,結(jié)果調(diào)了一個下午。 #include<iostream>#include<algorithm>#include<cassert>#include<cma...  閱讀全文

            posted @ 2009-04-04 01:05 abilitytao 閱讀(590) | 評論 (1)編輯 收藏

            ACM模板之—堆棧(模板類)

            //BEGIN_TEMPLATE_BY_ABILITYTAO_ACM
            #include<iostream>
            #include
            <algorithm>
            #include
            <cassert>
            using namespace std;

            template
            <class T>
            class Stack
            {

            private:
                
            int top;
                T 
            *element;
                
            int maxsize;
            public:
                Stack(
            int n=100000);
                
            ~Stack(){delete []element;}
                
            void push(const T &item);
                T pop();
                T gettop();
                
            int size();
                
            void clear(){top=-1;}
                
            bool isempty()const {return top==-1;}
                
            bool isfull()const {return top==maxsize-1;}
            }
            ;

            template
            <class T>
            Stack
            <T>::Stack(int n = 100000):top(-1),maxsize(n)
            {

                element
            =new T[maxsize];
                assert(element
            !=0);
            }


            template
            <class T>
            void Stack<T>::push(const T &item)
            {

                assert(
            !isfull());
                element[
            ++top]=item;
            }


            template
            <class T>
            T Stack
            <T>::pop()
            {

                assert(
            !isempty());
                
            return element[top--];
            }


            template
            <class T>
            T Stack
            <T>::gettop()
            {

                assert(
            !isempty());
                
            return element[top];
            }

            template
            <class T>
            int Stack<T>::size()
            {
                
            return top+1;
            }

            //END_TEMPLATE_BY_ABILITYTAO_ACM


            int main ()
            {

                Stack
            <int>test;
                
            bool b;
                
            int i;
                
            int n;
                
            for(i=1;i<=10;i++)
                
            {
                    b
            =test.isfull();
                    test.push(i);
                }

                n
            =test.size();
                b
            =test.isfull();
                
            for(i=1;i<=5;i++)
                    
            int n=test.pop();
                test.clear();
                
            for(i=1;i<=10;i++)
                    test.push(i);
                
            for(i=1;i<=10;i++)
                
            {
                    b
            =test.isempty();
                    cout
            <<test.pop();
                }

                b
            =test.isempty();
                
            return 0;
                


            }

            posted @ 2009-04-03 12:02 abilitytao 閱讀(1752) | 評論 (5)編輯 收藏

            C++中模板使用介紹(轉(zhuǎn))

            1. 模板的概念。

            我們已經(jīng)學過重載(Overloading),對重載函數(shù)而言,C++的檢查機制能通過函數(shù)參數(shù)的不同及所屬類的不同。正確的調(diào)用重載函數(shù)。例如,為求兩個數(shù)的最大值,我們定義MAX()函數(shù)需要對不同的數(shù)據(jù)類型分別定義不同重載(Overload)版本。

            //函數(shù)1.

            int max(int x,int y);
            {return(x>y)?x:y ;}

            //函數(shù)2.
            float max( float x,float y){
            return (x>y)? x:y ;}

            //函數(shù)3.
            double max(double x,double y)
            {return (c>y)? x:y ;}

            但如果在主函數(shù)中,我們分別定義了 char a,b; 那么在執(zhí)行max(a,b);時 程序就會出錯,因為我們沒有定義char類型的重載版本。

            現(xiàn)在,我們再重新審視上述的max()函數(shù),它們都具有同樣的功能,即求兩個數(shù)的最大值,能否只寫一套代碼解決這個問題呢?這樣就會避免因重載函數(shù)定義不 全面而帶來的調(diào)用錯誤。為解決上述問題C++引入模板機制,模板定義:模板就是實現(xiàn)代碼重用機制的一種工具,它可以實現(xiàn)類型參數(shù)化,即把類型定義為參數(shù), 從而實現(xiàn)了真正的代碼可重用性。模版可以分為兩類,一個是函數(shù)模版,另外一個是類模版。

            2.   函數(shù)模板的寫法

            函數(shù)模板的一般形式如下:

            Template <class或者也可以用typename T>

            返回類型 函數(shù)名(形參表)
            {//
            函數(shù)定義體 }

            說明: template是一個聲明模板的關(guān)鍵字,表示聲明一個模板關(guān)鍵字class不能省略,如果類型形參多余一個 ,每個形參前都要加class <類型 形參表>可以包含基本數(shù)據(jù)類型可以包含類類型.

            請看以下程序:

            //Test.cpp

            #include <iostream>

            using std::cout;

            using std::endl;

            //聲明一個函數(shù)模版,用來比較輸入的兩個相同數(shù)據(jù)類型的參數(shù)的大小,class也可以被typename代替,

            //T可以被任何字母或者數(shù)字代替。

            template <class T>

            T min(T x,T y)

            { return(x<y)?x:y;}

            void main( )

            {

                 int n1=2,n2=10;

                 double d1=1.5,d2=5.6;

                 cout<< "較小整數(shù):"<<min(n1,n2)<<endl;

                 cout<< "較小實數(shù):"<<min(d1,d2)<<endl;

                 system("PAUSE");

            }

            程序運行結(jié)果: 

             

            程序分析:main()函數(shù)中定義了兩個整型變量n1 , n2 兩個雙精度類型變量d1 , d2然后調(diào)用min( n1, n2); 即實例化函數(shù)模板T min(T x, T y)其中T為int型,求出n1,n2中的最小值.同理調(diào)用min(d1,d2)時,求出d1,d2中的最小值.

            3. 類模板的寫法

            定義一個類模板:

            Template < class或者也可以用typename T >
            class
            類名{
            //類定義......
            };

            說明:其中,template是聲明各模板的關(guān)鍵字,表示聲明一個模板,模板參數(shù)可以是一個,也可以是多個。

            例如:定義一個類模板:

            // ClassTemplate.h
            #ifndef ClassTemplate_HH

            #define ClassTemplate_HH

            template<typename T1,typename T2>

            class myClass{

            private:

                 T1 I;

                 T2 J;

            public:

                 myClass(T1 a, T2 b);//Constructor

                 void show();

            };

            //這是構(gòu)造函數(shù)

            //注意這些格式

            template <typename T1,typename T2>

            myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}

            //這是void show();

            template <typename T1,typename T2>

            void myClass<T1,T2>::show()

            {

                 cout<<"I="<<I<<", J="<<J<<endl;

            }

            #endif

            // Test.cpp

            #include <iostream>

            #include "ClassTemplate.h"

            using std::cout;

            using std::endl;

            void main()

            {

                 myClass<int,int> class1(3,5);

                 class1.show();

                 myClass<int,char> class2(3,'a');

                 class2.show();

                 myClass<double,int> class3(2.9,10);

                 class3.show();

                 system("PAUSE");

            }

            最后結(jié)果顯示:

             

            4.非類型模版參數(shù)

            一般來說,非類型模板參數(shù)可以是常整數(shù)(包括枚舉)或者指向外部鏈接對象的指針。

            那么就是說,浮點數(shù)是不行的,指向內(nèi)部鏈接對象的指針是不行的。


            template<typename T, int MAXSIZE>

            class Stack{

            Private:

                   T elems[MAXSIZE];

            };

            Int main()

            {

                   Stack<int, 20> int20Stack;

                   Stack<int, 40> int40Stack;

            };

            posted @ 2009-04-03 11:14 abilitytao 閱讀(14759) | 評論 (16)編輯 收藏

            CONST使用解析(轉(zhuǎn))

            看到const 關(guān)鍵字,C++程序員首先想到的可能是const 常量。這可不是良好的條件反射。如果只知道用const 定義常量,那么相當于把火藥僅用于制作鞭炮。const 更大的魅力是它可以修飾函數(shù)的參數(shù)、返回值,甚至函數(shù)的定義體。

            const 是constant 的縮寫,“恒定不變”的意思。被const 修飾的東西都受到強制保護,可以預(yù)防意外的變動,能提高程序的健壯性。所以很多C++程序設(shè)計書籍建議:“Use const whenever you need”。


            1.用const 修飾函數(shù)的參數(shù)

            如果參數(shù)作輸出用,不論它是什么數(shù)據(jù)類型,也不論它采用“指針傳遞”還是“引用傳遞”,都不能加const 修飾,否則該參數(shù)將失去輸出功能。const 只能修飾輸入?yún)?shù):

            如果輸入?yún)?shù)采用“指針傳遞”,那么加const 修飾可以防止意外地改動該指針,起到保護作用。

            例如StringCopy 函數(shù):

            void StringCopy(char *strDestination, const char *strSource);

            其中strSource 是輸入?yún)?shù),strDestination 是輸出參數(shù)。給strSource 加上const修飾后,如果函數(shù)體內(nèi)的語句試圖改動strSource 的內(nèi)容,編譯器將指出錯誤。

            如果輸入?yún)?shù)采用“值傳遞”,由于函數(shù)將自動產(chǎn)生臨時變量用于復(fù)制該參數(shù),該輸入?yún)?shù)本來就無需保護,所以不要加const 修飾。

            例如不要將函數(shù)void Func1(int x) 寫成void Func1(const int x)。同理不要將函數(shù)void Func2(A a) 寫成void Func2(const A a)。其中A 為用戶自定義的數(shù)據(jù)類型。

            對于非內(nèi)部數(shù)據(jù)類型的參數(shù)而言,象void Func(A a) 這樣聲明的函數(shù)注定效率比較底。因為函數(shù)體內(nèi)將產(chǎn)生A 類型的臨時對象用于復(fù)制參數(shù)a,而臨時對象的構(gòu)造、復(fù)制、析構(gòu)過程都將消耗時間。

            為了提高效率,可以將函數(shù)聲明改為void Func(A &a),因為“引用傳遞”僅借用一下參數(shù)的別名而已,不需要產(chǎn)生臨時對象。但是函數(shù)void Func(A &a) 存在一個缺點:

            “引用傳遞”有可能改變參數(shù)a,這是我們不期望的。解決這個問題很容易,加const修飾即可,因此函數(shù)最終成為void Func(const A &a)。

            以此類推,是否應(yīng)將void Func(int x) 改寫為void Func(const int &x),以便提高效率?完全沒有必要,因為內(nèi)部數(shù)據(jù)類型的參數(shù)不存在構(gòu)造、析構(gòu)的過程,而復(fù)制也非???,“值傳遞”和“引用傳遞”的效率幾乎相當。

            問題是如此的纏綿,我只好將“const &”修飾輸入?yún)?shù)的用法總結(jié)一下。

            對于非內(nèi)部數(shù)據(jù)類型的輸入?yún)?shù),應(yīng)該將“值傳遞”的方式改為“const 引用傳遞”,目的是提高效率。例如將void Func(A a) 改為void Func(const A &a)。

            對于內(nèi)部數(shù)據(jù)類型的輸入?yún)?shù),不要將“值傳遞”的方式改為“const 引用傳遞”。否則既達不到提高效率的目的,又降低了函數(shù)的可理解性。例如void Func(int x) 不應(yīng)該改為void Func(const int &x)。


            2 .用const 修飾函數(shù)的返回值
            如果給以“指針傳遞”方式的函數(shù)返回值加const 修飾,那么函數(shù)返回值(即指針)的內(nèi)容不能被修改,該返回值只能被賦給加const 修飾的同類型指針。例如函數(shù)
            const char * GetString(void);
            如下語句將出現(xiàn)編譯錯誤:
            char *str = GetString();
            正確的用法是
            const char *str = GetString();
            如果函數(shù)返回值采用“值傳遞方式”,由于函數(shù)會把返回值復(fù)制到外部臨時的存儲單元中,加const 修飾沒有任何價值。
            例如不要把函數(shù)int GetInt(void) 寫成const int GetInt(void)。
            同理不要把函數(shù)A GetA(void) 寫成const A GetA(void),其中A 為用戶自定義的數(shù)據(jù)類型。
            如果返回值不是內(nèi)部數(shù)據(jù)類型,將函數(shù)A GetA(void) 改寫為const A & GetA(void)的確能提高效率。但此時千萬千萬要小心,一定要搞清楚函數(shù)究竟是想返回一個對象的“拷貝”還是僅返回“別名”就可以了,否則程序會出錯。
            函數(shù)返回值采用“引用傳遞”的場合并不多,這種方式一般只出現(xiàn)在類的賦值函數(shù)中,目的是為了實現(xiàn)鏈式表達。

            例如:
            class A
            {
            A & operate = (const A &other); // 賦值函數(shù)
            };
            A a, b, c; // a, b, c 為A 的對象

            a = b = c; // 正常的鏈式賦值
            (a = b) = c; // 不正常的鏈式賦值,但合法
            如果將賦值函數(shù)的返回值加const 修飾,那么該返回值的內(nèi)容不允許被改動。上例中,語句 a = b = c 仍然正確,但是語句 (a = b) = c 則是非法的。


            3. const 成員函數(shù)
            任何不會修改數(shù)據(jù)成員(即函數(shù)中的變量)的函數(shù)都應(yīng)該聲明為const 類型。如果在編寫const 成員函數(shù)時,不慎修改了數(shù)據(jù)成員,或者調(diào)用了其它非const 成員函數(shù),編譯器將指出錯誤,這無疑會提高程序的健壯性。以下程序中,類stack 的成員函數(shù)GetCount 僅用于計數(shù),從邏輯上講GetCount 應(yīng)當為const 函數(shù)。編譯器將指出GetCount 函數(shù)中的錯誤。
            class Stack
            {
            public:
            void Push(int elem);
            int Pop(void);
            int GetCount(void) const; // const 成員函數(shù)
            private:
            int m_num;
            int m_data[100];
            };
            int Stack::GetCount(void) const
            {
            ++ m_num; // 編譯錯誤,企圖修改數(shù)據(jù)成員m_num
            Pop(); // 編譯錯誤,企圖調(diào)用非const 函數(shù)
            return m_num;
            }
            const 成員函數(shù)的聲明看起來怪怪的:const 關(guān)鍵字只能放在函數(shù)聲明的尾部,大概是因為其它地方都已經(jīng)被占用了。
            關(guān)于Const函數(shù)的幾點規(guī)則:

            a. const對象只能訪問const成員函數(shù),而非const對象可以訪問任意的成員函數(shù),包括const成員函數(shù).
            b. const對象的成員是不可修改的,然而const對象通過指針維護的對象卻是可以修改的.
            c. const成員函數(shù)不可以修改對象的數(shù)據(jù),不管對象是否具有const性質(zhì).它在編譯時,以是否修改成員數(shù)據(jù)為依據(jù),進行檢查.
            e. 然而加上mutable修飾符的數(shù)據(jù)成員,對于任何情況下通過任何手段都可修改,自然此時的const成員函數(shù)是可以修改它的

            posted @ 2009-04-03 11:01 abilitytao 閱讀(233) | 評論 (0)編輯 收藏

            ACM模板之—循環(huán)隊列(模板類)

            //BEGIN_TEMPLATE_BY_ABILITYTAO_ACM
            #include<cassert>
            #include
            <iostream>
            #include
            <cmath>
            #include
            <algorithm>
            using namespace std;

            template
            <class T>
            class Queue
            {
            private:
                
            int front,rear;
                T 
            *element;
                
            int maxsize;
            public:
                Queue(
            int n=10000);
                
            ~Queue(){delete []element;}
                
            void push_back(T item);
                T pop_front();
                T get_front();
                
            void clear(){front=rear=0;}
                
            bool isempty(){return front==rear;}
                
            bool isfull(){return (rear+1)%maxsize==front;}
                
            int lenth(){return (rear-front+maxsize)%maxsize;}
            }
            ;


            template
            <class T>
            Queue
            <T>::Queue(int n=10000)
            {
                front
            =0;
                rear
            =0;
                maxsize
            =n;
                element
            =new T[maxsize];
            }


            template
            <class T>
            void Queue<T>::push_back( T item)
            {

                assert(
            !isfull());
                rear
            =(rear+1)%maxsize;
                element[rear]
            =item;
            }


            template
            <class T>
            T Queue
            <T>::pop_front()
            {
                assert(
            !isempty());
                front
            =(front+1)%maxsize;
                
            return element[front];
            }


            template
            <class T>
            T Queue
            <T>::get_front()
            {

                assert(
            !isempty());
                
            return element[(front+1)%maxsize];
            }

            //END_TEMPLATE_BY_ABILITYTAO_ACM






            /////////////////////////////////////////////////////////////////////////////////////////////
            int main()
            {
                Queue
            <int> test(10);
                
            int n;
                
            int i;
                
            for( i=1;i<=9;i++)
                    test.push_back(i);
                n
            =test.get_front();
                n
            =test.lenth();
                test.clear();
                n
            =test.lenth();
                
            return 0;
            }

            雖然這個模板已經(jīng)通過簡單測試,不過我還是有幾問題不太明白,希望大家能幫我解釋一下:
            這個隊列中的數(shù)組寫成動態(tài)形式是一個不錯的想法,但是調(diào)試的時候比較麻煩,因為debug時在test.element下面看不到任何數(shù)組元素。不知道該怎么解決?

            posted @ 2009-04-02 20:57 abilitytao 閱讀(1885) | 評論 (8)編輯 收藏

            數(shù)據(jù)結(jié)構(gòu)作業(yè)之-拓撲排序(C++實現(xiàn))

            //張宏數(shù)據(jù)結(jié)構(gòu)作業(yè)之__拓撲排序
            //Get Guidance by Mr ZhangHong
            //Student:abilitytao

            #include
            <iostream>
            #include
            <cmath>
            #include
            <cstdio>
            #include
            <algorithm>
            #include
            <stack>
            using namespace std;
            #define MAX 9999

            stack
            <int>mystack;
            int indegree[MAX];

            struct node 
            {
                
            int adjvex;
                node
            * next;
            }
            adj[MAX];

            int Create(node adj[],int n,int m)//鄰接表建表函數(shù),n代表定點數(shù),m代表邊數(shù)
            {
                
            int i;
                node 
            *p;
                
            for(i=1;i<=n;i++)
                
            {
                    
                    adj[i].adjvex
            =i;
                    adj[i].next
            =NULL;
                }

                
            for(i=1;i<=m;i++)
                
            {
                    cout
            <<"請輸入第"<<i<<"條邊:";
                    
            int u,v;
                    cin
            >>u>>v;
                    p
            =new node;
                    p
            ->adjvex=v;
                    p
            ->next=adj[u].next;
                    adj[u].next
            =p;
                }

                
            return 1;
            }



            void print(int n)//鄰接表打印函數(shù)
            {
                
            int i;
                node 
            *p;
                
            for(i=1;i<=n;i++)
                
            {
                    p
            =&adj[i];
                    
            while(p!=NULL)
                    
            {
                        cout
            <<p->adjvex<<' ';
                        p
            =p->next;
                    }

                    cout
            <<endl;
                }

            }


            void topsort(node adj[],int n)
            {

                
            int i;
                node 
            *p;
                memset(indegree,
            0,sizeof(indegree));
                
            for(i=1;i<=n;i++)
                
            {

                    p
            =adj[i].next;
                    
            while(p!=NULL)
                    
            {
                        indegree[p
            ->adjvex]++;
                        p
            =p->next;
                    }

                }

                
            for(i=1;i<=n;i++)
                
            {

                    
            if(indegree[i]==0)
                        mystack.push(i);
                }

                
            int count=0;
                
            while(mystack.size()!=0)
                
            {

                    i
            =mystack.top();
                    mystack.pop();
                    cout
            <<i<<' ';
                    count
            ++;
                    
            for(p=adj[i].next;p!=NULL;p=p->next)
                    
            {
                        
            int k=p->adjvex;
                        indegree[k]
            --;
                        
            if(indegree[k]==0)
                            mystack.push(k);
                    }

                }

                cout
            <<endl;
                
            if(count<n)cout<<"有回路"<<endl;
            }




            int main()
            {
                
            int n;
                
            int m;
                cout
            <<"請輸入頂點數(shù)及邊數(shù):";
                cin
            >>n>>m;
                Create(adj,n,m);
                cout
            <<"輸入的鄰接表為:"<<endl;
                print(n);
                cout
            <<"拓撲排序結(jié)果為:"<<endl;
                topsort(adj,n);
                system(
            "pause");
                
            return 0;
            }


            posted @ 2009-04-01 17:45 abilitytao 閱讀(3808) | 評論 (2)編輯 收藏

            數(shù)據(jù)結(jié)構(gòu)作業(yè)之鄰接表的插入和刪除

            /*張宏數(shù)據(jù)結(jié)構(gòu)(第七章_圖)作業(yè):
            題目描述:在有向圖中
            (1)增加一條弧  Addarc(adj,u,v)
            (2)刪除一條弧  Delarc(adj,u,v)
            */

            #include
            <iostream>
            #include
            <cmath>
            #include
            <cstdio>
            #include
            <algorithm>
            #include
            <string>
            using namespace std;
            #define MAX 1000000

            struct node 
            {
                
            int adjvex;
                node
            * next;
            }
            adj[MAX];

            int Create(node adj[],int n,int m)//鄰接表建表函數(shù),n代表定點數(shù),m代表邊數(shù)
            {
                
            int i;
                node 
            *p;
                
            for(i=1;i<=n;i++)
                
            {

                    adj[i].adjvex
            =i;
                    adj[i].next
            =NULL;
                }

                
            for(i=1;i<=m;i++)
                
            {
                    cout
            <<"請輸入第"<<i<<"條邊:";
                    
            int u,v;
                    cin
            >>u>>v;
                    p
            =new node;
                    p
            ->adjvex=v;
                    p
            ->next=adj[u].next;
                    adj[u].next
            =p;
                }

                
            return 1;
            }



            int  Addnode(int u,int v)//此函數(shù)用于增加邊
            {

                node 
            *p;
                p
            =new node;
                p
            ->adjvex=v;
                p
            ->next=adj[u].next;
                adj[u].next
            =p;
                
            return 1;
            }



            int deletenode(int u,int v)//此函數(shù)用于邊的刪除
            {

                node 
            *P=adj[u].next;
                node 
            *q=&adj[u];
                
            while(P!=NULL)
                
            {

                    
            if(P->adjvex==v)
                    
            {
                        q
            ->next=P->next;
                        delete P;
                        
            break;
                    }


                }

                
            return 1;
            }


            void print(int n)//鄰接表打印函數(shù)
            {
                
            int i;
                node 
            *p;
                
            for(i=1;i<=n;i++)
                
            {
                    p
            =&adj[i];
                    
            while(p!=NULL)
                    
            {
                        cout
            <<p->adjvex<<' ';
                        p
            =p->next;
                    }

                    cout
            <<endl;
                }

            }



            int main()
            {

                
            int n;
                
            int m;
                cout
            <<"                         數(shù)據(jù)結(jié)構(gòu)第七章(圖)作業(yè)"<<endl;
                cout
            <<"                                    "<<endl;
                cout
            <<"題目描述:"<<endl;
                cout
            <<"有向圖中(1)增加一條弧  Addarc(adj,u,v)"<<endl;
                cout
            <<"        (2)刪除一條弧  Delarc(adj,u,v)"<<endl<<endl<<endl;
                cout
            <<"請輸入頂點的數(shù)目: ";
                cin
            >>n;
                cout
            <<"請輸入鄰邊的數(shù)目: ";
                cin
            >>m;
                Create(adj,n,m);
                cout
            <<"輸入的鄰接表為:"<<endl;
                print(n);
                
            int u,v;
                cout
            <<"接下來執(zhí)行添加操作,請輸入邊u,v(注意請不要和上表中的邊重復(fù)):";
                cin
            >>u>>v;
                Addnode(u,v);
                cout
            <<"此時鄰接表為:"<<endl;
                print(n);
                cout
            <<"接下來執(zhí)行刪除操作,請輸入邊u,v:";
                cin
            >>u>>v;
                deletenode(u,v);
                cout
            <<"此時鄰接表為:"<<endl;
                print(n);
                cout
            <<"演示結(jié)束,謝謝您的使用"<<endl;
                
            return 0;
            }


            posted @ 2009-03-30 21:27 abilitytao 閱讀(1229) | 評論 (0)編輯 收藏

            僅列出標題
            共42頁: First 32 33 34 35 36 37 38 39 40 Last 
            国产精品久久一区二区三区| 欧美国产精品久久高清| 欧美一区二区三区久久综合| 亚洲午夜久久久久妓女影院| 久久精品草草草| 伊人 久久 精品| av无码久久久久不卡免费网站| 国产成人精品综合久久久| 狠狠色丁香婷婷久久综合五月| 奇米综合四色77777久久| 91性高湖久久久久| 麻豆精品久久久久久久99蜜桃 | 久久精品这里热有精品| 久久九九久精品国产| 久久久久久久久无码精品亚洲日韩| 丁香五月网久久综合| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久久久久亚洲精品影院| 久久亚洲私人国产精品| 久久露脸国产精品| 久久美女网站免费| 久久精品国产亚洲AV香蕉| 久久青青色综合| 女同久久| 久久一本综合| 久久国产高清一区二区三区| 91视频国产91久久久| 久久婷婷五月综合色奶水99啪 | 久久这里的只有是精品23| 国产无套内射久久久国产| 久久99国产精品久久| 国产精品视频久久| 狠狠色丁香久久婷婷综合五月| 99精品国产99久久久久久97| 久久受www免费人成_看片中文| 午夜视频久久久久一区| 亚洲精品久久久www| 午夜精品久久久久久| 日日狠狠久久偷偷色综合免费| 久久丝袜精品中文字幕| 亚洲另类欧美综合久久图片区|