P2765 魔术球问题
这道题的思路实在是太罕见了,所以发一篇blog
从某一新放入的球开始看起
1.放入原来的柱子上
2.放入新的柱子
并将每个点进行拆点,然后将可以组成平方数的两个树相连,在每次跑网络流的时候记录流的流向即可,如果流量为0,则表明1行不通,只能新来第一个柱子
#include
#include
#define inf 0x7fffffff
#define ll long long
#define re int
#define void inline void
#define eps 1e-5
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pb push_back
#define P pair < int , int >
#define mk make_pair
#define fi first
#define se second
#define unordered_map map
using namespace std;
using namespace __gnu_pbds;
const int M&#61;1e5&#43;5;
const int mod&#61;1e9;
const int N&#61;2e6&#43;5;
int n,s,t&#61;100005;
int first[N],p,all;
int nxt[N],v[N];
namespace GP
{struct node{int ver,edge,next;}e[N];int tot&#61;1,head[N];int d[N],gap[N];void add(int x,int y,int z){e[&#43;&#43;tot].ver&#61;y;e[tot].edge&#61;z;e[tot].next&#61;head[x];head[x]&#61;tot;}void addedge(int x,int y,int z){add(x,y,z);add(y,x,0);}void bfs(){int z&#61;rs(p);
for(re i&#61;0;i<&#61;z;i&#43;&#43;) gap[i]&#61;d[i]&#61;0;
queue < int > q;q.push(t),d[t]&#61;gap[1]&#61;1;