把每個球拆成兩個點,源點和左側連,右側和匯點連,並將左側和比這個點小的且和這個點的和為完全平方數的點的右側連,這就是每個點需要建立的關係。我們從第乙個點開始,每次將乙個點加進圖中,建立如上關係,跑最大流。如果有新流即是該點可以放在現有的柱子上,反之則是需要新增柱子,當需要新增第n+1個柱子時就不再加點了。在跑最大流時,記錄一下路徑,即每個點跟在哪個點之後,最後輸出即可。
#include#include#include#include#includeusing namespace std;
const int n=4010,m=150000,inf=0x7fffffff;
struct edgedata[m*2];
int n,k,s,t,num,cnt1,cnt2,flow,h[n],p[n],dep[n],cur[n],squ[70];
bool vis[n];
queueq;
inline int read()
while(ch>='0'&&ch<='9')
return f?-x:x;
}inline void add(int x,int y,int f)
inline bool bfs(int s,int t)
} }return dep[t];
}int dfs(int u,int t,int lim)
} }return res;
}inline int dinic(int s,int t)
int main()
printf("%d\n",--cnt2);
memset(vis,false,sizeof vis);
for(int j,i=1;i<=cnt2;i++)
printf("\n");
} return 0;
}
洛谷P2765 魔術球問題
問題描述 假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為1,2,3,的球。1 每次只能在某根柱子的最上面放球。2 在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。試設計乙個演算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子上最多可放11 個球。程式設計任務 對於給定的n...
洛谷 P2765 魔術球問題
有n個柱子,編號為1,2 的小環,要將它們依次套在環上,要求直接接觸的兩小球的和為完全平方數,那麼最多可以套幾個小球。首先可以貪心,如果可以套在其他小球上,則套在其他小球上,反之,套在柱子上,直到沒有多餘柱子,可以證明這是對的,但我覺得還是網路流的做法比較重要。因為要依次取小球,那麼當答案為ans時...
洛谷 P2765 魔術球問題
問題描述 假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為1,2,3,的球。1 每次只能在某根柱子的最上面放球。2 在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。試設計乙個演算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子上最多可放11 個球。程式設計任務 對於給定的n...