今天的學習時間是從晚6點開始,一道簡單的題目,消耗了我三個半小時,其實是先看了一道關於hash的題目,沒有看懂,就用看了一道題目,正好碰到了簡單的並查集。雖然今天也是很苦逼,但是心情似乎沒有那麼差了,也許是我來學習之前就想明白了,不想說自己生活上的事情,我們單單對於演算法來講,千萬不要因為你沒有ac一道題目,沒有看懂一道題目的解析而感到沮喪,傷心。。更不能把這種情緒帶到生活的其他方面。反而我們可以通過其他事情,來緩和我們對於沒有ac的沮喪心情。
題目:問題描述
w星球的乙個種植園,被分成 m * n 個小格仔(東西方向m行,南北方向n列)。每個格仔裡種了一株合根植物。
這種植物有個特點,它的根可能會沿著南北或東西方向伸展,從而與另乙個格仔的植物合成為一體。
如果我們告訴你哪些小格仔間出現了連根現象,你能說出這個園中一共有多少株合根植物嗎?
輸入格式
第一行,兩個整數m,n,用空格分開,表示格仔的行數、列數(1樣例輸入
5 4 16
2 3
1 5
5 9
4 8
7 8
9 10
10 11
11 12
10 14
12 16
14 18
17 18
15 19
19 20
9 13
13 17
樣例輸出
5樣例說明
其合根情況參考下圖
const int max=1000001;//陣列範圍一定要明確
int parent[max];
int rank[max];
int find(int p)
return p;
}void uniono(int p,int q)
if(rank[pid]>rank[qid])else if(rank[pid]>m>>n;
int k=m*n;
for(int i=1;i<=k;i++)
int x,y,l;
cin>>l;
for(int i=0;i>x>>y;
uniono(x,y);
} int *p = new int[k+1];
for(int i=1;i<=k;i++)
int s=0;
for(int i=1;i<=k;i++)
} cout並查集的構建,關鍵在於需要設定兩個方法:uniono(合併)與find(查詢)
原始的簡單方法:
int id[10];//構建乙個id陣列,用於表示節點間的關係。如:陣列奇數元素定義為0,偶數元素定義為1,則表示奇數元素節點互相相連,偶數元素節點互相相連
int find(int p)
void uniono(int p,int q)else
}採用父節點的思想,所有連線節點屬於乙個父節點
int parent[10];
int find(int p)
return p;
}void uniono(int p,int q)
parent[pid]=qid;
}
基於rank的優化
int parent[10];
int rank[10];
int find(int p)
return p;
}void uniono(int p,int q)
if(rank[pid]>rank[qid])else if(rank[pid]
parent[pid]=qid;
}else
}
路徑壓縮:
int parent[10];
int rank[10];
int find(int p)
return p;
}void uniono(int p,int q)
if(rank[pid]>rank[qid])else if(rank[pid]
}
備戰藍橋杯決賽 堅持第七天!!!
今天的目標是刷真題,看看國賽題目的難度。四道題目,其中三道根本看不懂,就算是看其他人寫的 也不是很明白,而且這四道題目是b組題,想想我那國賽a組題,那難度比這還要高乙個檔次啊!內心是崩潰的,也許我這兩周小突破,不足以讓我提公升很多,還剩最後七天,我更應該在基礎的知識點還有心態上下功夫,如果像現在這個...
第六天 風氣
第六天 風氣 答 人有了,就得定規矩,否則就是一幫烏合之眾,而不是團隊。1必須朝九晚五。嚴格控制員工手裡有辦公室鑰匙。下班必須準時鎖門,員工準時離開。斷公司外網。要加班必須上級主管簽字,更不准在辦公室留宿,洗澡。這一條很重要,不要讓程式設計師活得像個浪子,精神恍惚,口中神叨,鬍子拉碴,這都是浮動工作...
開課第六天
今天是開課第六天,老師上午沒有講課,講了一上午的題,下午又講了新知識,如下 1 順序結構 從上到下順序進行。2 分支結構 if boolean表示式 else switch 值 case 值 break case 值 break switch 執行流程,switch的值和case的值一一比較,如果一...