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

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

            #

            淺究初等數論之中國剩余定理(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:設d=gcd(a,n),假定對整數x和y滿足d=ax+by(比如用擴展Euclid算法求出的一組解)。如果d | b,則方程ax=b(mod n)有一個解x0滿足x0=x*(b/d) mod n 。特別的設e=x0+n,方程ax=b(mod n)的最小整數解x1=e mod (n/d),最大整數解x2=x1+(d-1)*(n/d)。
             定理2:假設方程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;
            }

            //當時魚頭讓我們研究的時候,沒有考慮得太仔細,上面的方程只能求出一個可行解
            //而下面的函數能夠求出最小的整數解,甚至在模n內任意的解
            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;//確保是正數
                x0%=(n/d);//x0是第一個大于0的整數解
                return x0;
            }


            int CHINESE_RESIDUE_THEOREM(int n[],int b[],int k)//求解模線性方程組,所有數據從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
            <<"請輸入方程的個數:";
                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 閱讀(1623) | 評論 (0)編輯 收藏

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

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

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

            POJ 2643-Election(map容器水之)

            這道題的大意是:
            有n個黨派,每個黨派有一位主席,現在選舉國家領導人,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 閱讀(393) | 評論 (0)編輯 收藏

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

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

            posted @ 2009-04-04 01:05 abilitytao 閱讀(586) | 評論 (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 閱讀(1751) | 評論 (5)編輯 收藏

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

            1. 模板的概念。

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

            //函數1.

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

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

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

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

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

            2.   函數模板的寫法

            函數模板的一般形式如下:

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

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

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

            請看以下程序:

            //Test.cpp

            #include <iostream>

            using std::cout;

            using std::endl;

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

            //T可以被任何字母或者數字代替。

            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<< "較小整數:"<<min(n1,n2)<<endl;

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

                 system("PAUSE");

            }

            程序運行結果: 

             

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

            3. 類模板的寫法

            定義一個類模板:

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

            說明:其中,template是聲明各模板的關鍵字,表示聲明一個模板,模板參數可以是一個,也可以是多個。

            例如:定義一個類模板:

            // 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();

            };

            //這是構造函數

            //注意這些格式

            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");

            }

            最后結果顯示:

             

            4.非類型模版參數

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

            那么就是說,浮點數是不行的,指向內部鏈接對象的指針是不行的。


            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 閱讀(14741) | 評論 (16)編輯 收藏

            CONST使用解析(轉)

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

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


            1.用const 修飾函數的參數

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

            如果輸入參數采用“指針傳遞”,那么加const 修飾可以防止意外地改動該指針,起到保護作用。

            例如StringCopy 函數:

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

            其中strSource 是輸入參數,strDestination 是輸出參數。給strSource 加上const修飾后,如果函數體內的語句試圖改動strSource 的內容,編譯器將指出錯誤。

            如果輸入參數采用“值傳遞”,由于函數將自動產生臨時變量用于復制該參數,該輸入參數本來就無需保護,所以不要加const 修飾。

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

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

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

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

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

            問題是如此的纏綿,我只好將“const &”修飾輸入參數的用法總結一下。

            對于非內部數據類型的輸入參數,應該將“值傳遞”的方式改為“const 引用傳遞”,目的是提高效率。例如將void Func(A a) 改為void Func(const A &a)。

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


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

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

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


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

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

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

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

            //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;
            }

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

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

            數據結構作業之-拓撲排序(C++實現)

            //張宏數據結構作業之__拓撲排序
            //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)//鄰接表建表函數,n代表定點數,m代表邊數
            {
                
            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)//鄰接表打印函數
            {
                
            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
            <<"請輸入頂點數及邊數:";
                cin
            >>n>>m;
                Create(adj,n,m);
                cout
            <<"輸入的鄰接表為:"<<endl;
                print(n);
                cout
            <<"拓撲排序結果為:"<<endl;
                topsort(adj,n);
                system(
            "pause");
                
            return 0;
            }


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

            數據結構作業之鄰接表的插入和刪除

            /*張宏數據結構(第七章_圖)作業:
            題目描述:在有向圖中
            (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)//鄰接表建表函數,n代表定點數,m代表邊數
            {
                
            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)//此函數用于增加邊
            {

                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)//此函數用于邊的刪除
            {

                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)//鄰接表打印函數
            {
                
            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
            <<"                         數據結構第七章(圖)作業"<<endl;
                cout
            <<"                                    "<<endl;
                cout
            <<"題目描述:"<<endl;
                cout
            <<"有向圖中(1)增加一條弧  Addarc(adj,u,v)"<<endl;
                cout
            <<"        (2)刪除一條弧  Delarc(adj,u,v)"<<endl<<endl<<endl;
                cout
            <<"請輸入頂點的數目: ";
                cin
            >>n;
                cout
            <<"請輸入鄰邊的數目: ";
                cin
            >>m;
                Create(adj,n,m);
                cout
            <<"輸入的鄰接表為:"<<endl;
                print(n);
                
            int u,v;
                cout
            <<"接下來執行添加操作,請輸入邊u,v(注意請不要和上表中的邊重復):";
                cin
            >>u>>v;
                Addnode(u,v);
                cout
            <<"此時鄰接表為:"<<endl;
                print(n);
                cout
            <<"接下來執行刪除操作,請輸入邊u,v:";
                cin
            >>u>>v;
                deletenode(u,v);
                cout
            <<"此時鄰接表為:"<<endl;
                print(n);
                cout
            <<"演示結束,謝謝您的使用"<<endl;
                
            return 0;
            }


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

            僅列出標題
            共42頁: First 32 33 34 35 36 37 38 39 40 Last 
            久久99毛片免费观看不卡| 精品免费久久久久国产一区| 99久久国产免费福利| 亚洲AV无码久久精品色欲| 伊人色综合久久天天网| 日本欧美国产精品第一页久久| 久久亚洲精品中文字幕三区| 久久精品国产一区| 久久亚洲国产欧洲精品一| 亚洲综合精品香蕉久久网97 | 久久综合九色综合精品| 久久久无码精品亚洲日韩蜜臀浪潮| 久久精品aⅴ无码中文字字幕不卡| 久久笫一福利免费导航 | 久久久久99精品成人片牛牛影视| 99久久国产主播综合精品| 久久播电影网| 久久精品视频一| 日韩久久久久久中文人妻 | 国产女人aaa级久久久级| 久久国产热这里只有精品| 欧美亚洲国产精品久久| 奇米影视7777久久精品| 91精品国产91久久| 一本综合久久国产二区| 久久99精品久久只有精品| 99久久无码一区人妻| 久久婷婷五月综合成人D啪 | 青青青青久久精品国产h| 久久人人爽人人澡人人高潮AV | 久久精品视频网| 亚洲欧美国产精品专区久久| 久久人爽人人爽人人片AV| 99久久精品国产一区二区| 日韩欧美亚洲综合久久| 久久青草国产精品一区| 久久国产AVJUST麻豆| 一级做a爰片久久毛片人呢| 国产成人久久精品一区二区三区 | 天天爽天天爽天天片a久久网| 亚洲欧洲中文日韩久久AV乱码|