#include #include #include #include #include #include #include using namespace std; typedef long long LL; const int INF=0x3f3f3f3f; const int MAXN=2010; int N,M; struct Edge{ int from,to,cap,flow; }; struct Dinic{ int n,m,s,t; vector edges; vector G[MAXN]; bool vis[MAXN]; int d[MAXN]; int cur[MAXN]; void clear_all(int n){ for(int i=0;i q; q.push(s); d[s]=0; vis[s]=1; while(!q.empty()){ int x=q.front(); q.pop(); int len=G[x].size(); for(int i=0;ie.flow){ vis[e.to]=1; d[e.to]=d[x]+1; q.push(e.to); } } } return vis[t]; } int DFS(int x,int a){ if(x==t||a==0) return a; int flow=0,f,len=G[x].size(); for(int& i=cur[x];i0){ e.flow+=f; edges[G[x][i]^1].flow-=f; flow+=f; a-=f; if(a==0) break; } } return flow; } int maxflow(int s,int t){ this->s=s; this->t=t; int flow=0; while(BFS()){ memset(cur,0,sizeof(cur)); flow+=DFS(s,INF); } return flow; } int mincut(){ int ans=0; int len=edges.size(); for(int i=0;i0) ans++; } return ans; } void reduce(){ int len=edges.size(); for(int i=0;i p[MAXN]; struct HeapNode{ int u,d; bool operator < (const HeapNode& rhs) const{ return d>rhs.d; } }; struct Edge2{ int u,v,dist; }; struct Dijkstra{ int n,m; vector edges; vector G[MAXN]; bool done[MAXN]; void init(int n){ this->n=n; for(int i=0;i q; for(int i=0;id[u]+e.dist){ d[e.v]=d[u]+e.dist; p[e.v].clear(); p[e.v].push_back(u); q.push((HeapNode){e.v,d[e.v]}); } else if(d[e.v]==d[u]+e.dist){ p[e.v].push_back(u); q.push((HeapNode){e.v,d[e.v]}); } } } } }solver2; int num[MAXN]; int dfs(int u){ if(u==0) return 0; if(num[u]!=INF) return num[u]; int len=p[u].size(); for(int i=0;i