标签:scanf col printf 节点 print ring name inf 运用
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N = 3e3+10; const int inf = 0x3f3f3f3f; int n,m; int val[N]; struct edge{ int next,to,w; }a[N<<4]; int head[N],cnt; int fa[N],size[N]; int f[N][N],vis[N]; void add(int u,int v,int w){ a[++cnt]=(edge){head[u],v,w}; head[u]=cnt; } int dfs(int x){ if(val[x]){ f[x][1]=val[x]; return 1; } int sum=0,t; for(int i=head[x];i;i=a[i].next){ int v=a[i].to; t=dfs(v); sum+=t; for(int j=sum;j>=1;--j) for(int k=1;k<=t;++k) f[x][j]=max(f[x][j],f[x][j-k]+f[v][k]-a[i].w); } return sum; } int main() { scanf("%d%d",&n,&m); for(int i=1,k;i<=n-m;++i){ scanf("%d",&k); for(int j=1,x,y;j<=k;++j){ scanf("%d%d",&x,&y); add(i,x,y); } } for(int i=n-m+1;i<=n;++i) scanf("%d",&val[i]); memset(f,-inf,sizeof(f)); for(int i=1;i<=n;++i) f[i][0]=0; dfs(1); for(int i=m;i>=1;--i){ if(f[1][i]>=0){ printf("%d",i); break; } } return 0; }
标签:scanf col printf 节点 print ring name inf 运用
原文地址:https://www.cnblogs.com/nnezgy/p/11579277.html