對於最小樹形圖的理解

最小樹形圖的演算法步驟簡化得說一下就是重複一下三個步驟,直到圖中沒有環為止或者判定有孤立節點無法形成最小樹形圖:1、刪除自環,除根節點以外,每個點留最小入邊;2、判斷有沒有環;3、如果有環,縮為一點。現在就從頭開始分析一下這個演算法。分析第一步:留每個點地最小入邊,這個沒有問題,也是一種貪心的思想;為什麼留的是入邊,這也很好解釋,有入邊這個點才能被到達。分析第二步:如果這個圖是連通的,每一個點留一條入邊,那麼此時圖中就有n-1條邊,如果有環那麼必定有點之間沒有被串連;如果有孤立節點,那麼一定是這

hdu4009 Transfer water ( 最小樹形圖的模板 )

題目:一個村莊發洪水,村民要搬到山上去,這就需要把水運上去。獲得水資源有兩種方式,第一,自己挖井,費用是海拔高度*x;第二,修水道引水,水道的費用是長度*Y,(長度=|x1 - x2|+|y1-y2| +|z1-z2|),另外,如果從比當前海拔低的人家引水,還有加Z這麼多的錢,是水泵的費用。求讓全村的人都能有水喝的最小費用!如果不能連通,輸出-1。分析:第一,由于海拔不同,修水道的費用不同,顯然是有向圖求最小費用;           第二,最小樹形圖的根不確定,但是有題意可知,水是從山下來的,

UVa11747 Heavy Cycle Edge (Kruskal)

卡了一道題,想今天怎麼都得過一道題,就先拿著開刀吧,比較簡單的#include <cstdio>#include <algorithm>#include <cstring>using namespace std;typedef long long ll;struct edge { int u, v; ll w; bool is;}e[25010];int n, m, fa[1010];bool cmp( edge a, edge b ) {

Uva 515 – King//差分約束

題目分析:這道題是一道裸地差分約束題,直接套模板。。。下面是代碼:#include<cstdio>#include<cstring>#include<queue>using namespace std;const int maxn = 210;const int INF = 100000000;int v[maxn],w[maxn],first[maxn],next[maxn];int

CF 272E Dima and Horses(2-SAT變形)

題目大意:有n個點,每個點都最多有三個敵對點,要將這個n個點分成兩組,而且每個組內的每個點,最多有一個敵對點和它在同一組裡面。在第一組設為0, 第二組設為1;然後輸出最後分配方案。分析:以節點i為例, i有三個敵對點,如果i在0組,那麼與i敵對的三個點中的兩個就一定要在1組。給每個點賦值為1或0,然後使得所有節點都滿足前述條件。很顯然就是2-SAT問題。因為每個點雖多有3個敵對點,所以,總是有解的。代碼://E//by Molly#include <cstdio>#define

Hdu 1007 – Quoit Design//分治,最近點對,計算幾何

正在學習演算法分析與設計,講到了分治法求最近點對。。。但是自己寫了一份代碼總是RE,求大神指教啊。下面的是RE的代碼:#include<cmath>#include<iostream>#include<algorithm>#define Min(a,b) (a<b?a:b)using namespace std;const int maxn = 100005;const double INF = 100000000.0;struct Points{

HDU 4514 湫湫系列故事——設計風景線 (並查集)

判斷有沒有環路,我個人認為還是並查集效率要高,而且複雜度要比dfs低,性價比很好這道題的要求,第一判斷是否有環,如果沒有環,就輸出最長的路徑我們可以想到一個無向圖如果沒有環的話,一定就是兩種形態,一種是一棵樹,另一種就是森林那麼要求最長路徑的話,也就是要求樹的半徑大致的思想明白了,就說一下細節吧並查集的思想就是在圖中找一個節點作為根,凡是和這點在一個連通分量裡面的點,都插入到這個根上,是的前驅是這個根或者前前驅是這個根,由於並查集的維護,使得這兒資料結構很高效,具體的內容可以找書看。有一個重要的

Uva 558 – Wormholes//Bellman-Ford

分析:模板題,但是要理解題意。環不和強連通分支差不多吧,我寫了一個基於強連通分支的代碼,但是WA了。。。。下面是AC代碼:#include<cstdio>#include<cstring>#include<queue>#include<vector>using namespace std;const int INF = 100000000;const int maxn = 1005;vector<int> G[maxn];int

CF 168(div2)

A.直接類比即可,最後根據翻轉次數奇偶判斷。B.類似連連看的判斷,要求判斷任意兩點間是否能最多隻轉一次方向就相連。對每一點,先拓展出和它相同行,相同列能連到的點,再對那些點再做一次拓展,記錄下總共能到達的點數目,判斷是否為總點數即可。代碼比較挫#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include

Poj 2255-Tree Recovery//二叉樹,遞迴

    這道題思路很簡單,但是不好寫遞迴!自己的遞迴思想弱爆了。    每次將先序和中序分為兩個部分,一個是左子樹,一個是右子樹。不斷的遞迴到結束為止!    下面是代碼:    #include<stdio.h>#include<string.h>#define MAXN 100char s1[MAXN],s2[MAXN],s[MAXN];void rebuild(int n,char *s1,char *s2,char

10986 – Sending email//Bellman-Ford

題目分析:裸的最短路,但是結點有點多,用鄰接矩陣會RE,用鄰接鏈表格儲存體圖。然後就BallmanFord了。吐槽:首先沒看資料一直RE,各種RE,然後輸出的時候#和數字寫反了,一直WA,囧!代碼:#include<cstdio>#include<cstring>#include<vector>#include<queue>using namespace std;const int INF = 2000000010;const int maxn =

Poj 3255(Dijkstra求次短路)

RoadblocksTime Limit: 2000MS Memory Limit: 65536KTotal Submissions: 5564 Accepted: 2111DescriptionBessie has moved to a small farm and sometimes enjoys returning to visit one of her best friends. She does not want to get to her old home too quickly,

組合數學學習之錯位排列(持續更新)

全錯位排列有三種解法,嘿嘿,那我就要一探究竟!一、遞推        假設排列是1,2,3,4···n個數,Dn表示n個數的全錯位排列的方法數。D1 = 0、D2 = 1        那麼對於第1個位置,假設由k去占。現在就有兩種情況:       1)、1和k互換了位置,k佔1的位置,1佔k的位置:那麼此時相當於1和k位置確定,只需要討論Dn-2的排列數。       2)、1沒有佔k的位置,而是佔了其它的位置:那麼此時相當於只確定了k的位置,需要討論Dn-1的排列數。       但是有(

hdu 2602 Bone Collector 簡單dp題 0-1背包

Bone CollectorTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14600    Accepted Submission(s): 5817Problem DescriptionMany years ago , in Teddy’s hometown there was a man who was called “Bone

UVa 10746 Crime Wava-The Sequel (最小費用最大流 + 精度)

這道題我提交很多次,多事submission error 後來重新寫了,就好了,總結一下,submission error 還是說明代碼有問題,這次我開始的時候沒有考慮到精度問題,而且數組也開得很小做題的時候,切忌心煩意亂,要平穩一些, 仔細一些,對於最大流的問題,要注意到點的數量,和標號,這個千萬不要錯還有,最小費用最大流,一定要給每條邊的反向邊也賦初值,互為反向邊的權值是互為倒數代碼如下:#include <cstdio>#include

Uva 442 – Matrix Chain Multiplication//棧

    分析:剛寫這道題的時候,就當作簡單的棧的題寫,但是有一點問題,就是矩陣相乘順序一定。所以代碼就寫的老長。調試的時候也不斷出錯。總之,我太急了,還沒在草稿紙上大號草稿就開始寫代碼。這樣子,效率太低了。還有自己寫代碼的能力太弱了。   #include<stdio.h>#include<string.h>#define MAXN 28struct martix{ int row; int col;} Martix[MAXN],temp[MAXN];int

數組裡的正數和負數排序

/* 假設一整型數組存在若干正數和負數,現在通過某種演算法使得該數組的所有負數在正數的左邊, 且保證負數之間和正數之間元素相對位置不變。時空複雜度要求分別為:o(n),o(1) 我是簡單類比的空間複雜度 o(1) 時間複雜度最壞 o(n*n)*/#include <stdio.h>void f(int a[],int n){ int temp=0,i=0,j,count=0; int num=0; int k; // while(i<n)

資料結構 樹

這裡先研究的是二叉樹。一、二叉樹的三個基本性質1、若二叉樹結點的層次從 1 開始, 則在二叉樹的第 i 層最多有2的( i-1)次方 個結點。( i≥1)2、深度為 k 的二叉樹最少有 k 個結點,最多有2的( k-1)次方個結點。( k≥1 )3、對任何一棵二叉樹,如果其葉結點有 n0 個, 度為 2 的非葉結點有 n2 個,   則有n0=n2+1。     下面簡單的證明下性質3。      一個二叉樹中共有三種點:度位零的點(也就是葉子結點),記為n0;度為一的點,記為n1;度為二的點,

Uva 112-Tree Summing//建樹,遍曆

    這道題參考了大牛們的結題報告。很久沒這樣了。關鍵是這題很是坑人,輸入有點困難。這道題不用建樹,只需要判斷葉子的位置就ok了。    剛開始一直在糾結如何處理輸入的問題,看了下大牛的代碼,很簡短,但是看的我雲裡霧裡的,似懂非懂的。    想到下午的觀察發現,發現輸入給的數位順序剛好是樹的先序遍曆。這樣就可以往樹的遍曆上入手了。這裡用c++的cin.clear()函數來處理輸入的問題,在用遞迴來遍曆樹(剛開始還沒看明白為什麼說是遞迴)。     簡單的將二叉樹畫出來吧! 

Hdu 1028 Ignatius and the Princess III//整數劃分(一)

直接代碼吧:/*Hdu 1028 Ignatius and the Princess III 整數劃分 */#include<iostream>#include<cstdio>using namespace std;const int maxn = 150;int f[maxn][maxn];int n;int main(){ while(cin>>n) { for(int i = 0; i <= n; i++)

總頁數: 61357 1 .... 13461 13462 13463 13464 13465 .... 61357 Go to: 前往

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.