Time of Update: 2018-12-04
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=2147 題目大意:就是有一個遊戲,在一個n*m的矩陣中起始位置是(1,m),走到終止位置(n,1);遊戲規則是只能向左,向下,左下方向走,想走到終點的為獲勝者。 這一題就是巴什博弈,自學的孩子苦啊,網上找的資料還是有些不懂,先存著: 只要把PN狀態圖描繪出來就行了:P點:就是P個石子的時候,對方拿可以贏(自己輸的)N點:就是N個石子的時候,自己拿可以贏現在關於P,N的求解有三個規則(1):最終態都是P
Time of Update: 2018-12-04
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1059題目大意:就是說有兩個人收集了一些漂亮的大理石,現在他們要分了它們,並且要每個人拿到的大理石的價值是一樣的。現在有價值為1---6的大理石,並且價值為i的大理石有amount[i]個;現在要問你在不把大理石破壞的前提下是否能把這些大理石分成價值一樣的兩堆。 本例可以用到DFS搜尋來解決。具體分析可參考:http://blog.csdn.net/li4951/article/details/743
Time of Update: 2018-12-04
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1532 題目大意:
Time of Update: 2018-12-04
主要思想就是:對一個AOV網路進行拓撲排序的方法:1:從AOV網路中選擇一個入度為0(即沒有直接前驅)的頂點並輸出2:從AOV網路中刪除該頂點及該頂點發出的所有的邊3:重複步驟1和2,直到找不到入度為0的頂點為止 按照上面的方法進行拓撲排序其結果有2種:一就是所有的頂點都被輸出,也就是整個拓撲排序完成了;二就是仍有頂點未被輸出,但剩下的圖中再也沒有入度為0的頂點,這樣的拓撲排序就無法進行下去,這就是說明該AOV圖存在有環圖。例題可參照:http://acm.hdu.edu.cn/showprob
Time of Update: 2018-12-04
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1599 題目大意:就是說8600要去旅行,給你若干個景區,8600想要找到一條路線,比如從A出發最終回到A,並且除了出發點外其餘的景區不會不會重複走一遍,如V1>V2>V3>....>Vn,並且景區數不少於3.現在要求你找出一條花費最少的路徑。其中資料N,M為景區數,道路數。a,b,c表示從a到b需要花費c元。 解法:就是利用Floyd演算法擴充求出無向圖的最小環。 注意:無向
Time of Update: 2018-12-04
一:匈牙利演算法的原理:從當前的匹配M(如果木有匹配,則取初始化匹配M為空白集)出發,檢查每一個未蓋點,然後從它出發尋找可增廣路,找到可增廣路,則沿著這條可增廣路進行擴充,直到不存在可增廣路為止。二:根據從未蓋點出發尋找可增廣路搜尋的方法,可以分成:1.DFS增廣 2.BFS增廣 3.多增廣(Hopcroft-Karp演算法) 採用DFS思想搜尋可增廣路並求出最大匹配的代碼如下:#define MAX 101//MAX為表示X集合和Y集合頂點個數最大值的符號常量int vis[MAX]
Time of Update: 2018-12-04
順序儲存轉化為連結儲存:BTreeNode *create(char* str, int pose, int size) //下標從0開始{ char ch; BTreeNode * t;char* p=str;ch = p[pose];if(ch=='#'|| pose>=size) return NULL; // 表示空結點else { t=(BTreeNode *)malloc(sizeof(BTreeNode)); //非空則構造新結點t->data=ch;
Time of Update: 2018-12-04
題意明確 代碼:#include<iostream>using namespace std;struct Binode{char data;Binode* lchild;Binode* rchild;};class Bitree{private:Binode *root;void Release(Binode *bt){if(bt!=NULL){Release(bt->lchild);Release(bt->rchild);delete bt;}}void
Time of Update: 2018-12-04
題意就是將普通的二叉樹轉化為完全二叉樹。該二叉樹用連結儲存,完全二叉樹用順序儲存。想法就是把空結點分配空間並其資料域賦為‘#’;指標域為空白。層序遍曆該二叉樹參考代碼:#include<iostream>using namespace std;struct BiNode{char data;BiNode *lchild,*rchild;};char a[200];int flag,len,k;class BiTree{private:BiNode* root;BiNode*
Time of Update: 2018-12-04
所謂的二叉樹相似是指要麼它們都為空白或都只有一個根結點,要麼它們的左右樹均相似。參考代碼:#include<iostream>using namespace std;struct Binode{char data;Binode* lchild;Binode* rchild;};class Bitree{private:Binode* root1;Binode* root2;Binode* Creat(Binode* bt){char ch;cin>>ch;if(ch=='
Time of Update: 2018-12-04
問題:求二叉樹中根結點到P結點的路徑void path(char ch){int top=-1;int tag[100];BiNode *A[100];//類比棧BiNode
Time of Update: 2018-12-04
題目串連:http://acm.hdu.edu.cn/showproblem.php?pid=1598題目大意:就是說有一個很奇葩的星球,假設有n個城市和m條路,每條路有自己的最大速度。現在給你起點和終點,要你求出一條路線是的你從起點可以到達終點並且這條路線中的速度的最大值和最小值是最小的。題目思路:該題用到最小產生樹的演算法,,使用克魯斯卡爾。。先將道路權值自小到大排序,再依次枚舉權值下限,每次枚舉一個下限時,初始化一次,然後Kruskal演算法直到起點和終點兩點被連通,記錄這一路的極值。接著
Time of Update: 2018-12-04
1,Havel-Hakimi定理主要用來判定一個給定的度序列是否是可圖的。2,首先介紹一下度序列:若把圖 G 所有頂點的度數排成一個序列 S,則稱 S 為圖 G 的度序列。3,一個非負整數組成的有限序列如果是某個無向圖的序列,則稱該序列是可圖的。4,判定過程:(1)對當前數列排序,使其呈遞減。(2)從S【2】開始對其後S【1】個數字-1。(3)一直迴圈直到當前序列出現負數(即不是可圖的情況)或者當前序列全為0 (可圖)時退出。5,舉例:序列S:7,7,4,3,3,3,2,1 刪除序列S的首項 7
Time of Update: 2018-12-04
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=2546 解題思路:要使得買飯後卡上的餘額達到最小,但由於有限制條件就是卡上的必須剩下不小於5元才能買飯,這樣的情況用01背包是肯定錯誤的得不到最優的解,我們知道要使得卡上餘額最小那就是要讓最貴的菜最後買,所以剩下來的n-1種菜就可以用01背包求解了 #include<iostream>using namespace std;#define max(a,b) a>b?a:bint w[
Time of Update: 2018-12-04
問題如下:1.輸入一個正整數N;2.把N顯示出來;3.如果N=1時則結束一切操作;4.如果N是奇數則N變為3*N+1,否則N變為N/2;5.轉入步驟2.問題分析:這道題目比較簡單,我們只需要按照題目的要求一步步的做下去就可以找到結果。參考代碼:#include<iostream>using namespace std;int max,M;void LINK(int n){cout<<n<<'
Time of Update: 2018-12-04
題目連結:http://acm.fzu.edu.cn/problem.php?pid=1924解法之一就是用並查集把點集構成樹,如果構成的不是樹而有一些點形成環路,那就是說明存在死結了題目代碼:#include<iostream>#include<stdio.h>using namespace std;int parent[1000];void UFset(int n){for(int i=0;i<n;i++)parent[i]=i;}int Find(int x)
Time of Update: 2018-12-04
Problem DescriptionAfter awarded lands to ACMers, the queen want to choose a city be her capital. This is an important event in ice_cream world, and it also a very difficult problem, because the world have N cities and M roads, every road was
Time of Update: 2018-12-04
輸入一個自然數K(K>1),若存在自然數M和N(M>N),使得K^M和K^N均大於或等於1000,且它們的末尾三位元相等,則稱M和N是一對“K尾相等數”。現在請編程求出M+N值最小的K尾相等數。---問題分析對於一個數,它的冪是無窮無盡的,但是我們可以注意到末尾三位元只有1000個,也就是表明一定會有重複的末尾三位元,當一個數的末尾三位元一定時,它的下一次冪的末尾三位元也一定了。也就是表明當第一次重複出現大於等於1000的末尾三位元時,這就是我們要求出的M和N了。程式:#includ
Time of Update: 2018-12-04
一:根據擴充二叉樹的前序走訪序列建立該二叉樹Binode* Creat(Binode* bt){char ch;cin>>ch;if(ch=='#')bt=NULL;else{bt=new Binode;bt->data=ch;bt->lchild=Creat(bt->lchild);bt->rchild=Creat(bt->rchild);}return
Time of Update: 2018-12-04
/*輸出前n個自然數的所有排列*/#include<iostream>using namespace std;void swap(int &x,int &y){int temp=x;x=y;y=temp;}int n;int data[100];void solve(int t){if(t==n){for(int i=1;i<=n;i++){cout<<data[i]<<' ';}cout<<endl;return;}for(