1. 程式人生 > >NOIP 2017 寶藏

NOIP 2017 寶藏

題目傳送門

  傳送門

題目大意

  (家喻戶曉的題目不需要題目大意)

  設$f_{d, s}$表示當前樹的深度為$d$,與第一個打通的點連通的點集為$s$。

  每次轉移的時候不考慮實際的深度,深度都當做$d$,尋找連線兩個點集最小邊集,如果能連線更淺的點,那麼會在之前轉移,所以即使轉移非法也不可能成為最優解。

  找連線兩個點集的最小邊集合可以預處理。

  我比較懶,不想預處理,時間複雜度$O(n^{2}3^{n})$。

Code

 1 /**
 2  * uoj
 3  * Problem#333
 4  * Accepted
 5  * Time: 123ms
6 * Memory: 1412k 7 */ 8 #include <iostream> 9 #include <cstdlib> 10 #include <cstdio> 11 using namespace std; 12 typedef bool boolean; 13 14 const int N = 12, S = 1 << N; 15 const signed inf = (signed) (~0u >> 1); 16 17 template <typename T> 18 void
pfill(T* pst, const T* ped, T val) { 19 for ( ; pst != ped; *(pst++) = val); 20 } 21 22 int n, m; 23 int g[N][N]; 24 int f[N + 1][S]; 25 int cost[S]; 26 27 inline void init() { 28 scanf("%d%d", &n, &m); 29 for (int i = 0; i < n; i++) 30 for (int j = 0; j < n; j++)
31 g[i][j] = inf; 32 for (int i = 0, u, v, w; i < m; i++) { 33 scanf("%d%d%d", &u, &v, &w), u--, v--; 34 g[v][u] = g[u][v] = min(g[u][v], w); 35 } 36 } 37 38 int id[S]; 39 inline void solve() { 40 int S = (1 << n); 41 pfill(f[1], f[n + 1], inf); 42 pfill(cost, cost + S, inf); 43 for (int i = 0; i < n; i++) 44 id[1 << i] = i; 45 for (int i = 0; i < n; i++) 46 f[1][1 << i] = 0; 47 int ans = f[0][S - 1]; 48 for (int d = 2; d <= n; d++) { 49 for (int s = 0, val; s < S; s++) { 50 if ((val = f[d - 1][s]) == inf) 51 continue; 52 cost[0] = 0; 53 for (int ns = (s + 1) | s, cs, w, wc, cur; ns < S; ns = (ns + 1) | s) { 54 cs = (ns ^ s), w = cost[cs ^ (cs & (-cs))], wc = inf; 55 if (w == inf) 56 continue; 57 cur = id[(cs & (-cs))]; 58 for (int i = 0; i < n; i++) 59 if (s & (1 << i)) 60 wc = min(wc, g[cur][i]); 61 if (wc == inf) 62 continue; 63 f[d][ns] = min(f[d][ns], val + (w + wc) * (d - 1)); 64 cost[cs] = w + wc; 65 } 66 67 for (int ns = s; ns < S; ns = (ns + 1) | s) 68 cost[ns ^ s] = inf; 69 } 70 ans = min(ans, f[d][S - 1]); 71 } 72 printf("%d\n", ans); 73 } 74 75 int main() { 76 init(); 77 solve(); 78 return 0; 79 }

相關推薦

NOIP 2017 寶藏 - 動態規劃

題目傳送門   傳送門 題目大意   (家喻戶曉的題目不需要題目大意)   設$f_{d, s}$表示當前樹的深度為$d$,與第一個打通的點連通的點集為$s$。   每次轉移的時候不考慮實際的深度,深度都當做$d$,尋找連線兩個點集最小邊集,如果能連線更淺的點,那麼會在之前轉移,

NOIP 2017 寶藏 包括部分分做法!

一個小小的開頭 對於這道題本蒟講講自己的一些想法:分別是20分做法、40分做法、70分做法(暫時還沒做出,會補上的)、和100分做法。 其實現在的我很是不明白當初(去年高二時)參加noip時這一道題

NOIP 2017 寶藏

題目傳送門   傳送門 題目大意   (家喻戶曉的題目不需要題目大意)   設$f_{d, s}$表示當前樹的深度為$d$,與第一個打通的點連通的點集為$s$。   每次轉移的時候不考慮實際的深度,深度都當做$d$,尋找連線兩個點集最小邊集,如果能連線更淺的點,那麼會在之前轉移,所以即使

noip 2017 提高組

amp 子串 names ef6 space one 一個 logs sum T1 神奇的幻方 題目傳送門 就只是一道模擬題 水水水 #include<cstdio> #include<cstring> #include<algorithm

NOIP 2017 集訓散記

余數 left 下一個 ... tro 給定 跑步 割點 同余 17.10.5 Maze   題意   給定一張 $n \times m$ , 包含空地 ‘.‘ 和障礙 ‘#‘ 的格點圖.   給定起點和終點, 求從起點到終點的必須經過點有多少個.   $n, m \le

[日常] NOIP 2017滾粗記

頹廢 空間 繼續 密碼 斷開 lin 怎麽辦 還要 模擬 突然挑了這麽個滑稽的時間補了遊記... (成績日常延時再加上人太菜估計基本上就是頹廢記錄) 然而文化課太廢可能會被強制退役QAQ所以先補了再說吧 day0 一大早被老姚交代了個開十一機房門的任務... 打開

[NOIp 2017]列隊

註意 iostream esc || 女孩子 noi class cst namespace Description Sylvia 是一個熱愛學習的女孩子。 前段時間,Sylvia 參加了學校的軍訓。眾所周知,軍訓的時候需要站方陣。 Sylvia 所在的方陣中有$n

NOIP 2017 Day2 T1 奶酪

c++ names str day ica while -- 是否 ++ luogu題面 兩天中唯一的良心題,然而我在考場上蜜汁 RE 成70... 做法應該很多,樸素做法應該有 並查集 和 搜索 ; 我打的 並查集,不過好像 DFS 快的一批; 思路很簡單,就是把能連

NOIP 2017 Day1 T1 小凱的疑惑

bsp .org blank math sca ace ... nth noip luogu題面 小學奧數呵呵 在考場上40分鐘沒證出來(數學太差),運氣好看到了規律... 來一波證明: 定義 f(a,b) 表示在 gcd(a,b)==1 情況下的答案。 貝祖定理 易證

NOIP 2017 Day1 T2 時間復雜度

span nth 記錄 soft ans sof space ems noip luogu題面 大模擬...並不難(然而考場上寫掛了) 用 3 個讀入函數,解決讀入問題 雙棧齊發,一個記錄使用過的字母,另一個記錄復雜度貢獻情況 用 bre 表示當前跳出循環的層數 用

NOIP 2017 賽後反思 [補檔]

情況 noip 似的 完成 div bfs 相關 二分圖 模擬 首先寫一下比賽的情況: D1: T1: 之前做過類似的題目, 因而知道大致的結論, 迅速完成. T2: 貌似直接模擬就可以了, 涉及到字符串信息提取, 比較麻煩, 因而想放到最後做. T3: 非常簡潔的圖論題,

NOIP-2017

單單 在一起 一起 顯示 教練 快的 err 代表大會 昨天 Day0 下午來到熟悉的長沙理工,簡單到考場轉轉就各自散了。回賓館後有點淡淡的焦慮…… 晚上被教練喊去開機房人民代表大會,大家簡單討論了一下,回去後找wzy要了個對拍,然後就帶著焦慮睡下了。 Day1 進考場後

[NOIP 2017] 逛公園

i++ inf make pri edge can 最短 bits push [題目鏈接] http://uoj.ac/problem/331 [算法] 首先,我們預處理出每個點到第N個點的最短路,這等價於在反圖上求第N個點到其余點的最短路

[NOIP 2017普及組 No.2] 圖書管理員

其中 ali 一個空格 空格 size 讀者 bsp 需要 輸入格式 [NOIP 2017普及組 No.2] 圖書管理員 【題目描述】   圖書館中每本書都有一個圖書編碼,可以用於快速檢索圖書,這個圖書編碼是一個正整數。   每位借書的讀者手中有一個需求碼,這個需求碼也是一

[NOIP 2017普及組 No.3] 棋盤

要花 code strong 開始 分開 格子 ron 一個空格 連續 [NOIP 2017普及組 No.3] 棋盤 【題目描述】 有一個m × m的棋盤,棋盤上每一個格子可能是紅色、黃色或沒有任何顏色的。你現在要從棋盤的最左上角走到棋盤的最右下角。 任何一個時刻,

[NOIp 2017] Complexity

string corona pac 我不 查詢 () 一次 [] 初始 洛谷 3952 輸入一整行字符串時,如果中間有空格,則不能用 scanf("%s",...) 來輸入! scanf() 會在空格處停下! 在NOIp2018 前夕終於做出了NOIp2017的題 Cand

NOIP 2017 逛公園

題目連結 https://www.luogu.org/problemnew/show/P3953   覺得是dp,想了一個n*最短路長度的dp 發現數組開不下…… 而且我也不知道怎麼在圖上做dp 不是DAG,不能拓撲   然後就寫了個K=0的情況,寫了個最短路計數,水了30

NOIP 2017 Day1 T2 時間複雜度 complexity - 模擬題 題解

作者@豪噠噠噠HaoDaDaDa 轉載自簡書@豪噠噠噠HaoDaDaDa-簡書-NOIP 2017 Day1 T2 時間複雜度 (有一個月沒有寫簡書了…) (這次終於開始拿Markdown寫了,富文字可以走開了) 說說為什麼我要寫這道題… 因為…dalao們寫的都是兩百多行的程式碼看不懂

最短路+拓撲排序+dp NOIP 2017 逛公園

讓我們一起來%forever_shi神犇 題意: 給你一個 n n n個點

NOIP 2017普及組複賽C/C++詳細題解報告

一、題目 https://wenku.baidu.com/view/f3fe5a326ad97f192279168884868762cbaebb71.html?from=search 二、題解 第1題 這題很簡單,因為輸入的三個數都是十的整數倍,所以計算結果不會有小數。