網路流二十四題之四 魔術球問題(BALL)

2021-07-11 15:57:35 字數 1428 閱讀 1756

假設有

n 根柱子,現要按下述規則在這

n根柱子中依次放入編號為 1,

2,3,

… 的球。

(1)每次只能在某根柱子的最上面放球。

(2)在同一根柱子中,任何

2 個相鄰球的編號之和為完全平方數。

試設計乙個演算法,計算出在

n根柱子上最多能放多少個球。例如,在

4 根柱子上最多可

放 11

個球。輸入檔案第

1 行有

1個正整數

n ,表示柱子數。

程式執行結束時,將

n根柱子上最多能放的球數以及相應的放置方案輸出。

檔案的第一行是球數。

接下來的

n 行,每行是一根柱子上的球的編號。

11

1 8

2 7 9

3 6 10

4 5 11

每根柱子互不干擾,可以把每根柱子看成一條路徑——這不就成了最小路徑覆蓋問題了嗎???

將相加為完全平方數的兩個數連一條邊,求解最小路徑覆蓋問題就可以解決 n0

個球最少需要多少根柱子的問題。

然後依次列舉 n0

,直到所需柱子的個數大於

n ,即可得出答案(這裡用列舉的原因是,每次不需要重新求解最大流)。

還有一種貪心的方法。

現在如果有

t個柱子,要放數

i ,從第乙個柱子開始試,試到能放的那個柱子,就把

i放進去,如果

t 個柱子都不行,就再多增加乙個柱子放 i。

易知,這樣得出的答案為 f(

n)=  

bool bfs()  

}  return dis[t]>0;  

}  int dfs(int now,int flow)  

}  }  

return 0;  

}  void dfs2(int now)  

}  int work(int front)

for(int i=1;iif(he[i+front])add(i,front+2000,1);  

}  add(s,front,1);add(front+2000,t,1);  

while(bfs())  

}  return weight;  

}  void work2(int front)  

while(bfs())  

}  int main()  

printf(」%d\n」,ll-1);  

work2(ll-1);  

for(int i=1;iif(!vis[i])  

return 0;  

}  

網路流二十四題之三 魔術球問題

先來說下怎麼建模。其實就是經典的拆點模型 1.將乙個數拆成兩個點集x0,x1。2.將x0連線至源點,x1連線至匯點 3.如果對於乙個數i要是想直接求解有點麻煩,所以可以列舉答案。每次新新增進來乙個數,然後直接在殘量網路上跑最大流就行,一旦匹配數達到n 1,也就是剛好完成了n個柱子,此時跳出就行 in...

網路流二十四題

開始了我的網路流 24 題之旅,寫在一起到時候方便一起複習哦。其實這並不是真的二十四題,有一些過於水的我就不寫上來了。然後有的 太水了就不寫了。感覺這些題目還是比較基礎的,方法卻值得借鑑!剩餘題目 航空路線問題 火星探險問題以下 題目描述 點此看題 解法 你發現時間是最大的障礙,因為對於不同的時間飛...

網路流二十四題之航空路線問題

這道題的建模很有意思 1.首先每個點,除了起點,都向拆點後的點練一天容量1,費用 1的邊,代表只能走一次,負費用是為了求最大的費用,也就是最多的經過點。對於起點,容量變成2,費用不變。2.其次對於一天航線,終點在拆點後的點集向起點連一條邊,容量無限,費用為0,代表兩個城市可以達到。之後一次費用流,如...