考慮如果i+j
i+ji+
j為完全平方數,則i
ii和j
jj之間連一條邊,那麼最後構成乙個圖g
gg,那麼問題即可轉化為尋找乙個最大的數字m
mm,使得按照上述方法構成的圖的最小路徑覆蓋數小於等於n
nn,我們二分m
mm即可,構造方案同最小路徑覆蓋一題。
#include
using
namespace std;
const
int n =
100000
;const
int inf =
0x3f3f3f3f
;int s,t,head[n]
,nxt[n]
,w[n]
,num=
1,to[n]
;void
add(
int u,
int v,
int ww)
int dep[n]
;bool vis[n]
;queue<
int> q;
bool
bfs()}
return vis[t];}
intdfs
(int u,
int d)
if(ret==
0) dep[u]=-
1;return ret;
}bool
check
(int num)
int par[n]
;void
init
(int n)
intfind
(int x)
void
unite
(int x,
int y)
intcal
(int all)}}
for(
int i=all+
1;i<=
2*all;i++
)int res=0;
while
(bfs()
) res+
=dfs
(s,inf)
;return all-res;
}int
main()
ans=l;
printf
("%d\n"
,ans)
; s=
0;t=
2*ans+1;
num=1;
memset
(head,0,
sizeof
(head));
for(
int i=
1;i<=ans;i++
)add
(s,i,1)
;for
(int i=
1;i<=ans;i++)}
}for
(int i=ans+
1;i<=
2*ans;i++
)int cc=0;
while
(bfs()
) cc+
=dfs
(s,inf)
;init(3
*ans)
;for
(int i=
1;i<=ans;i++)}
} vector<
int> ls;
for(
int i=ans;i;i--)}
if(ls.
empty()
)continue
;printf
("%d"
,ls[0]
);for(
int i=
1;i<
(int
)ls.
size()
;i++
)puts(""
);}return0;
}
網路流 24 題 魔術球
假設有 n n n 根柱子,現要按下述規則在這 n n n 根柱子中依次放入編號為 1,2,3,4,1,2,3,4,cdots 1,2,3,4,的球。每次只能在某根柱子的最上面放球。在同一根柱子中,任何 2 2 2 個相鄰球的編號之和為完全平方數。試設計乙個演算法,計算出在 n n n 根柱子上最多...
網路流 24 題 4 魔術球
題意 有n根柱子可以放球,球上的權值從1向後標。要求這n根柱子滿足 任意一根柱子上相鄰兩個球的和是乙個完全平方數 小的球在下面,大的球在上面 輸出最多放多少個球,和其中的一種方案。分析 第一想法是打表,是不是沒救了 然後首先就是考慮到了二分.然而範圍十分神奇.可以說是猜出來的。然後就是考慮把一些球連...
網路流24題 魔術球問題
列舉答案轉化為判定性問題,然後最小路徑覆蓋,可以轉化成二分圖最大匹配,從而用最大流解決。列舉答案a,在圖中建立節點1.a。如果對於i具體方法可以順序列舉a的值,當最小路徑覆蓋數剛好大於n時終止,a 1就是最優解。由於是順序放球,每根柱子上的球滿足這樣的特徵,即下面的球編號小於上面球的編號。抽象成圖論...