【正文】
flow=0。 memset(ans,0,sizeof(ans))。 while(BFS()){ memset(cur,0,sizeof(cur))。 int f = DFS(s,INF)。 flow += f 。 } for (int i=0。i()。i++){ Edge e=edges[i]。 ans[][]+=。 } return flow。 } inline void Init(){ s = 0, t = n+m+1。 ()。 for (int i=0。i=m+n+1。i++) G[i].clear() 。 for (int i=1。i=n。i++) AddEdge( s ,i,a[i]) 。 for (int i=1。i=m。i++) AddEdge(i+n,t,b[i]) 。 for (int i=1。i=n。i++) for (int j=1。j=m。j++)AddEdge(i,j+n,19)。 }}g。Truck 最大生成樹+LCAincludecstdioincludevectorincludecstringincludeiostreamincludealgorithmusing namespace std。const int INF=0x3f3f3f3f。const int N = 1e5 + 5。int n,m。struct gragh{ struct Edge{ int from,to,w。 Edge(){} Edge(int x,int y,int z):from(x),to(y),w(z){} bool operator (const Edgeamp。 a)const{ return w 。 } }edges[N],be[N]。 int E,f[N],fa[N][20],di[N][20],dep[N]。 bool vis[N]。 vectorint G[N]。 int F(int x){//鼯 return f[x]==x?x:(f[x]=F(f[x]))。 } inline void link(int x,int y,int z){ edges[++E]=Edge(x,y,z)。 G[x].push_back(E)。 } void build(){ E=0。 for (int i=1。i=n。i++)G[i].clear()。 int x,y,z。 for (int i=1。i=n。i++)f[i]=i。 for (int i=1。i=m。i++){ scanf(%d%d%d,amp。x,amp。y,amp。z)。 be[i]=Edge(x,y,z)。 f[F(x)]=F(y)。 } } void kruskal(){ int treenum = 0。//forests memset(vis,0,sizeof(vis))。 for (int i=1。i=n。i++)if (!vis[F(i)]){ treenum++。vis[F(i)]=1。 } for (int i=1。i=n。i++)f[i]=i。 sort(be+1,be+m+1)。 int t = 0。 for (int i=m。i=1。i){ int x = be[i].from。 int y = be[i].to 。 if (F(x)==F(y))continue。 f[F(x)]=F(y)。 t++。 link(x,y,be[i].w)。 link(y,x,be[i].w)。 if (t==ntreenum)break。 } } void dfs(int x){ vis[x] = 1。 for (int i=1。i=17。i++){ if(dep[x](1i))break。 fa[x][i]=fa[fa[x][i1]][i1]。 di[x][i]=min(di[x][i1],di[fa[x][i1]][i1])。 } for (int i=0。iG[x].size()。i++){ Edge e = edges[G[x][i]]。 if (vis[])continue。 fa[][0] = x。 di[][0] = 。 dep[] = dep[x]+1。 dfs()。 } } int lca(int x,int y){ if (dep[x]dep[y])swap(x,y)。 int t = dep[x] dep[y]。 for (int i=0。i=17。i++) if ((1i)amp。t) x = fa[x][i]。 for (int i=17。i=0。i) if (fa[x][i]!=fa[y][i]){ x=fa[x][i]。y=fa[y][i]。 } if (x==y)return x。 return fa[x][0]。 } int ask(int x,int f){//f:father int ans = INF。 int t = dep[x]dep[f]。 for (int i=0。i=17。i++)if(tamp。(1i)){ ans=min(ans,di[x][i])。 x = fa[x][i]。 } return ans。 } void work(){ build()。 kruskal()。 memset(vis,0,sizeof(vis))。 for (int i=1。i=n。i++)if(!vis[i])dfs(i)。 int q,x,y。 scanf(%d,amp。q)。 while (q){ scanf(%d%d,amp。x,amp。y)。 if (F(x)!=F(y))puts(1)。 else { int t = lca(x,y)。 x = ask(x,t)。 y = ask(y,t)。 printf(%d\n,min(x,y))。 } } }}g。int main(){ //freopen(,r,stdin)。 //freopen(,w,stdout)。 for (。~scanf(%d%d,amp。n,amp。m)。)()。 return 0。}背包include cstdioinclude cstringinclude algorithmusing namespace std。const int N = 100007。struct node { int v,w,n。 node(){} node(int x,int y,int z){ v=x,w=y,n=z。 }}a[N]。int f[N]。int main(){ //freopen(,r,stdin)。 int cash,n,x,y。 for (。~scanf(%d%d,amp。cash,amp。n)。){ int A = 0。 for(int i=1。i=n。i++){ scanf(%d%d,amp。x,amp。y)。 for (int t=0。(1t)x。t++){ int tt=1t。 a[++A]=node(y*tt,y*tt,1)。 x = tt。 } if (x)a[++A]=node(y*x,y*x,1)。 } memset(f,0,sizeof(f))。//01背包 for (int i=1。i=A。i++) for (int j=cash。j=a[i].v。j) f[j]=max(f[j],f[ja[i].v]+a[i].w)。 int ans = 0。//get ans for (int i=0。i=cash。i++) ans=max(ans,f[i])。 printf(%d\n,ans)。 } return 0。} 多重背包通用模板(單調隊列)int f[N]。int va[N], vb[N]。//MAX_Vvoid pack(int V,int v,int w,int n){ if (n==0||v==0) return。 if (n==1){//01背包 for (int i=V。i=v。i) f[i]=max(f[i],f[iv]+w)。 return。 } if (n*v=Vv+1){//多重背包(n = V / v) for (int i=v。i=V。++i) f[i]=max(f[i],f[iv]+w)。 return。 } for (int j = 0 。 j v 。 ++j ){ int *pb = va, *pe = va 1。 int *qb = vb, *qe = vb 1。 for (int k=j,i=0。k=V。k+=v,++i){ if (pe==pb+n){ if(*pb == *qb) ++qb。 ++pb。 } int tt = f[k] i * w。 *++pe = tt。 while (qe=qbamp。amp。 *qett)qe。 *++qe = tt。 f[k] = *qb + i * w。 } }}//主程序調用 memset(f,0,sizeof(f))。 //pack for (int i=1。i=n。i++) pack(cash,a[i].v,a[i].w,a[i].n)。 int ans = 0。 //getAns for (int i=0。i=cash。i++) ans=max(ans,f[i])。 printf(%d\n,ans)。//MeisellLehmer//G++ 218ms 43252kincludecstdioincludecmathusing name