日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51nod1307(暴力树剖/二分dfs/并查集)

發布時間:2025/3/14 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51nod1307(暴力树剖/二分dfs/并查集) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307

?

題意: 中文題誒~

?

思路:

解法1:暴力樹剖

用一個數組 num[i] 維護編號為 i 的邊當前最大能承受的重量. 在加邊的過程中根據給出的父親節點將當前邊所在的鏈上所有邊的num都減去當前加的邊的重量, 注意當前邊也要減自重. 那么當num首次出現負數時加的邊號即位答案;

事實上這個算法的時間復雜度是O(n^2)的, 不過本題并沒有出那種退化成單鏈的數據, 所以直接暴力也能水過;

代碼:

1 #include <iostream> 2 #include <stdio.h> 3 using namespace std; 4 5 const int MAXN = 5e4 + 10; 6 struct node{ 7 int c, w, pre; 8 }gel[MAXN]; 9 int num[MAXN];//num[i]為編號為i的繩子當前可以承受的最大重量 10 11 int main(void){ 12 int n, ans = -1; 13 scanf("%d", &n); 14 for(int i = 0; i < n; i++){ 15 scanf("%d%d%d", &gel[i].c, &gel[i].w, &gel[i].pre); 16 if(ans != -1) continue; 17 num[i] = gel[i].c; 18 int cnt = i; 19 while(cnt != -1){ 20 num[cnt] -= gel[i].w; 21 if(ans == -1 && num[cnt] <= -1) ans = i; 22 cnt = gel[cnt].pre;//指向cnt的父親節點 23 } 24 } 25 if(ans == -1) cout << n << endl; 26 else cout << ans << endl; 27 return 0; 28 } View Code

?

解法2: 二分 + dfs

很顯然在加邊的過程中所有邊的承受重量都是單調不減的, 那么可以考慮二分答案. 不過要注意判斷函數的寫法, 每一次判斷都需要判斷當前 mid條 邊組成的樹的所有邊, 而不能只判斷當前 mid 所在鏈上的邊, 顯然其他鏈上也可能存在不合法的邊. 判斷所有邊的話可以 dfs 一遍, 回溯時判斷即可.

代碼:

1 #include <iostream> 2 #include <stdio.h> 3 #include <vector> 4 #define ll long long 5 using namespace std; 6 7 const int MAXN = 5e4 + 10; 8 struct node{ 9 int c, w, pre; 10 }gel[MAXN]; 11 vector<int> sol[MAXN]; 12 bool flag; 13 14 ll dfs(int u, int x){ 15 ll sum = gel[u].w; 16 if(u > x) return 0;//mid邊后面的不要算上去 17 for(int i = 0; i < sol[u].size(); i++){ 18 sum += dfs(sol[u][i], x); 19 } 20 if(sum > gel[u].c && u) flag = false;//0是一個虛根,并沒有對應的邊 21 return sum; 22 } 23 24 int main(void){ 25 int n; 26 scanf("%d", &n); 27 for(int i = 1; i <= n; i++){ 28 scanf("%d%d%d", &gel[i].c, &gel[i].w, &gel[i].pre); 29 gel[i].pre++; 30 sol[gel[i].pre].push_back(i); 31 } 32 int l = 1, r = n, cnt = n; 33 while(l <= r){ 34 flag = true; 35 int mid = (l + r) >> 1; 36 dfs(0, mid); 37 if(flag) cnt = mid, l = mid + 1; 38 else r = mid - 1; 39 } 40 printf("%d\n", cnt); 41 } View Code

?

解法3: 并查集

記錄每個節點的父節點 然后按輸入順序的倒敘 遍歷每一個節點 計算以當前節點為根的子樹的重量 ( 因為按照題目的輸入順序來說 ?當前節點要么沒有子節點 ?要么子樹已經遍歷完 算入當前樹的重量) 當遍歷到某個節點時 當前節點與父節點的邊無法承載當前節點為根的子樹 ?便從輸入序列最晚輸入的節點開始刪除? 直到與父節點的邊的能夠承載當前節點為根的子樹 又或者已經把遍歷過的點都刪除完了? 這個過程中 ?用并查集維護某個節點 屬于那一個跟節點 并且不斷的壓縮路徑 每個條路徑被壓縮一次 均攤時間 就是邊的數量 所以 這種做法很穩定的 O(n) 上面這段話是直接從討論中復制過來的 代碼: 1 #include <iostream> 2 #include <stdio.h> 3 #include <vector> 4 #define ll long long 5 using namespace std; 6 7 const int MAXN = 1e5 + 10; 8 struct node{ 9 ll c, w, p; 10 }gel[MAXN]; 11 12 ll ww[MAXN]; 13 vector<int> vt[MAXN]; 14 int pre[MAXN], sol; 15 16 int find(int x){ 17 return pre[x] == x ? x : pre[x] = find(pre[x]); 18 } 19 20 void update(int u){ 21 for(int i = 0; i < vt[u].size(); i++){ 22 gel[u].w += gel[vt[u][i]].w; 23 pre[vt[u][i]] = u; 24 } 25 while(gel[u].w > gel[u].c){//u即為當前根節點 26 gel[find(sol)].w -= ww[sol]; 27 sol--; 28 } 29 } 30 31 int main(void){ 32 int n; 33 scanf("%d", &n); 34 for(int i = 1; i <= n; i++){ 35 scanf("%lld%lld%lld", &gel[i].c, &gel[i].w, &gel[i].p); 36 gel[i].p++; 37 vt[gel[i].p].push_back(i); 38 ww[i] = gel[i].w;//后面會對gel操作,所以需要先記錄下gel的初始值來 39 pre[i] = i; 40 } 41 sol = n; 42 for(int i = n; i > 0; i--){ 43 update(i); 44 } 45 printf("%d\n", sol); 46 return 0; 47 } View Code

?

轉載于:https://www.cnblogs.com/geloutingyu/p/7121750.html

總結

以上是生活随笔為你收集整理的51nod1307(暴力树剖/二分dfs/并查集)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲免费视频大全 | 免费观看毛片视频 | 欧美老女人bb | 欧美色亚洲 | 男人和女人做爽爽视频 | 精品欧美一区二区在线观看 | 天天色天天爽 | 欧美日韩亚洲色图 | av黄在线观看 | javxxx| 久草综合在线 | 欧美区二区三区 | 免费日本黄色片 | 国产小视频在线观看免费 | 麻豆国产网站 | 香蕉视频网页 | 一区二区视频播放 | 天天爽天天做 | 性欧美丰满熟妇xxxx性仙踪林 | 午夜久久久久久久久久 | 国产乱国产乱老熟 | 国产sm主人调教女m视频 | 91精品国产乱码久久久张津瑜 | 成年网站免费在线观看 | 色噜噜狠狠一区二区三区 | 国产嫩草在线观看 | 在线视频观看一区二区 | 亚洲va欧美 | 极品美女开粉嫩精品 | 国产爽爽爽 | 大地资源中文在线观看免费版 | 翔田千里一区 | 亚洲v欧美v另类v综合v日韩v | 亚洲精品乱码久久久久久黑人 | www.国产毛片| 国产精品高潮呻吟久久av野狼 | 日韩久久精品一区二区 | r级无码视频在线观看 | 亚洲视频综合网 | 热re99久久精品国产99热 | 激情亚洲色图 | www.在线观看av | 欧美猛操 | 国产高清一级片 | 国产一伦一伦一伦 | 视色视频 | 玖玖爱av| 亚洲综合不卡 | 538国产精品一区二区免费视频 | 99热在线观看免费 | 久艹在线 | 狠狠干狠狠插 | 国产在线播放一区二区三区 | 美国一级黄色大片 | 久久窝窝 | 丁香免费视频 | 四虎影城库 | 国产精品jizz | 激情网五月 | 视频精品久久 | 秋霞影院一区二区 | 香蕉av一区二区 | 在线视频这里只有精品 | 亚洲砖区区免费 | 国产视频三级 | 99操| 打屁股外国网站 | 四虎国产精品永久在线国在线 | 美女伦理水蜜桃4 | 亚洲黄色成人网 | x88av在线 | 午夜视频一区二区三区 | 亚洲精品视频在线观看免费 | 69视频国产 | 91麻豆精品国产91久久久无需广告 | 在线看黄网址 | 国产主播中文字幕 | 中文字幕婷婷 | 久久人人爽人人爽人人 | 精品人妻久久久久一区二区三区 | 久久久久久久黄色 | 国产精品永久久久久久久久久 | 不卡福利视频 | 欧美日韩精品免费 | 桥本有菜aⅴ一区二区三区 在线午夜电影 | 欧美黑人一级片 | 欧美tv | 黄色a一片 | 精品一区二区三区免费看 | 男女男精品网站 | 东京热加勒比无码少妇 | 久久99久久久久 | 国产精品熟女久久久久久 | 日本在线播放一区 | √天堂在线| 免费荫蒂添的好舒服视频 | 色一情一区二 | 国产99久久久国产精品成人免费 | 国产中文字幕三区 |