魔術球問題

2021-08-14 07:01:35 字數 1193 閱讀 4826

列舉放的球,先假設新建柱子,拆成兩個點,第乙個點連s,表示後面還可以放;第二個連t表示放到其他柱子上;再列舉放過的數和它是否組成完全平方數,列舉的數的第乙個點向它的第二個點連邊,表示這個球可以放到其他球上,容量都為一

每次跑最大流出來的表示會消掉的柱子個數,如果此時球-消去的比n大則break輸出答案

# include 

# include

# include

# include

# include

# define ll long long

# define rg register

# define il inline

# define mem(a, b) memset(a, b, sizeof(a))

# define max(a, b) (((a) > (b)) ? (a) : (b))

# define min(a, b) (((a) < (b)) ? (a) : (b))

# define sqr(a) ((a) * (a))

using

namespace

std;

il int get()

const

int maxn = 10001, maxm = 200001, inf = 2147483647;

int n, m, ft[maxn], cnt, ans, level[maxn], q[maxm], cur[maxn], match[maxn], vis[maxn];

struct edge edge[maxm];

il void add(rg int u, rg int v, rg int f); ft[u] = cnt++;

}il bool bfs(rg int s, rg int t)}}

return level[t];

}il int dfs(rg int u, rg int t, rg int maxf)

}if(!ret) level[u] = 0;

return ret;

}int main()

if(num - ans > n)

}for(rg int i = 1; i < num; i++)

if(!vis[i])

printf("\n");

}return

0;}

魔術球問題

題目描述 題解 個人認為網路流二十三題中比較有意思的一道。先列舉球數。每加乙個球,從 s 向 xi 連一條容量為 1 的邊,從 yi 向 t 連一條容量為 1 的邊。然後從 xi 向滿足 i j 為完全平方數的 yj 連容量為 1 的邊。在殘餘網路上跑 ek 或 dinic 如果得到的最大流為 0 ...

魔術球問題

曾經在模擬賽的時候做過弱化版,不需要輸出方案。其實加強版因為資料範圍很小,模擬做也未嘗不可,暴力算出n 55時最終答案也只有1567,拿二維陣列存一下方案即可。當然,這個題是由網路流做法的,雖然我的網路流做法只是模擬了乙個貪心的過程。貪心的正確性證明就請移步我的弱化版題解好啦 對於乙個球,有兩種放法...

魔術球問題 題解

具體的數學關係還是不會證,除了能打表發現球數規律外,內在原理也弄不清楚。戳很難想象是一道網路流。第一感是數學。但是看到資料範圍比較小,估計可以暴力dp。又發現,狀態轉移比較難,狀態調整比較多,dp估計難設,又看到資料範圍又小於dp通常可做範圍,所以用同樣以規劃和狀態設計為關鍵字的,狀態調整能力更強的...