網路流24題 魔術球問題

2022-05-25 19:18:18 字數 1470 閱讀 2545

假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為 1,2,3,4......的球。

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

(2)在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。

試設計乙個演算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子上最多可

放11個球。

´程式設計任務:

對於給定的n,計算在 n根柱子上最多能放多少個球。

第1 行有 1個正整數n,表示柱子數。

第一行是球數。

樣例方案如下

1 8

2 7 9

3 6 10

4 5 11

每一行表示乙個柱子上的球

n<=60 保證答案小於1600

正解:網路流

解題報告:乙個點最多上面有乙個點,下面有乙個點,然後我們就可以由此把圖構出來,把乙個點拆成兩個點,分別管上和下,分別連源點與匯點,把與源點和匯點連的邊容量定為1,是完全平方數的再連一條邊,然後跑出的最大流就是有多少個可以接在上面,然後用當前的點數減去最大流,就是要用的柱子數,然後動態加點,當要用的柱子數超過n時,上一次的點數就是最多能放的球。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 

9#define min(a,b) a10

#define rg register

11const

int n = 100000;12

const

int m = 30000;13

const

int inf = 2147483641;14

15using

namespace

std;

1617

intgi()

2324

struct

datenn[n];

2728

int s,t,m=m,head[n],nxt[n],f[n],dis[n],cnt=1;29

30void link(int l,int

r),nxt[cnt]=head[l],head[l]=cnt;

32 nn[++cnt]=(date),nxt[cnt]=head[r],head[r]=cnt;

33return;34

}3536int

bfs()

48return0;

49}5051

int dinic(int xh,int

sum)

60if (s==0) dis[xh]=-1;61

return

s;62}63

64int

main()

77 printf("

%d",xh-1

);78

return0;

79 }

網路流24題 魔術球問題

列舉答案轉化為判定性問題,然後最小路徑覆蓋,可以轉化成二分圖最大匹配,從而用最大流解決。列舉答案a,在圖中建立節點1.a。如果對於i具體方法可以順序列舉a的值,當最小路徑覆蓋數剛好大於n時終止,a 1就是最優解。由於是順序放球,每根柱子上的球滿足這樣的特徵,即下面的球編號小於上面球的編號。抽象成圖論...

魔術球問題(網路流24題)

假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為1,2,3,的球。1 每次只能在某根柱子的最上面放球。2 在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。試設計乙個演算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子上最多可放11 個球。對於給定的n,計算在n根柱子上最多能...

網路流24題 魔術球問題

以珠子為點,滿足條件就兩兩連邊 那麼就是讓你求n條路徑最多能覆蓋多少節點。眾所周知,最小邊覆蓋 點總數 最大匹配 不會看這裡link 於是拆點跑二分圖即可 大概就是s向x連邊 滿足條件的點k向x 連邊 x 向t連邊 有兩種方式 1.我們輪流加點,每次在殘量網路跑最大流就可以了 2.我們二分答案,每次...