首页 > 其他分享 >P1273 有线电视网

P1273 有线电视网

时间:2023-03-06 14:12:46浏览次数:41  
标签:sz nxt int 有线电视 void go P1273 hd

 

 f[u][j] =max( f[y][k] +f[u][j-k]- w[i] )

#include <bits/stdc++.h>
using namespace std ;
 const int N=3002,M=N*5,inf=0x7f7f3f;
 int n,m,sz[N];
 int a[N],nxt[M],go[M],hd[N],w[M],f[N][N],all;
 
 void add(int x,int y,int z){
 	go[++all]=y; nxt[all]=hd[x],w[all]=z,hd[x]=all;
 }
 void init(int x){
 	if(x>n-m) {
 		sz[x]=1; return;
 	}
 	 int i,y;
   for(i=hd[x];i;i=nxt[i]){ y=go[i],init(y); sz[x]+=sz[y];}
 }
 void dfs(int x){
 	int i,j,y,k,s=0;
 	if(x>n-m) return;
 	
 	for(i=hd[x];i;i=nxt[i]){
 		y=go[i]; dfs(y);
 		s+=sz[y];
 		
 		for(j=s;j>0;j--)
 		 for(k=1;k<=sz[y];k++)
 	 if(j-k>=0) f[x][j]=max(f[x][j],f[x][j-k]+f[y][k]-w[i]);
 	}
 }
 
 int main(){
 	int i,j,x,y,t;
 	 cin>>n>>m;
 	for(i=1;i<=n;i++) for(j=1;j<=n;j++) f[i][j]=-inf;
	
	for(i=1;i<=n-m;i++){
		cin>>t;
		
		while(t--){
			cin>>x>>y; add(i,x,y);
		}
	}
	for(i=n-m+1;i<=n;i++) cin>>f[i][1];
	
	for (i=1;i<=n;i++) f[i][0]=0;
	init(1),dfs(1);
	
 	for(i=m;i>=1;i--){
 		if(f[1][i]>=0){ cout<<i<<'\n';break;}
 	}
 }
 

 
 

 

标签:sz,nxt,int,有线电视,void,go,P1273,hd
From: https://www.cnblogs.com/towboa/p/17183618.html

相关文章

  • 381. 有线电视网络
    题目链接381.有线电视网络给定一张\(n\)个点\(m\)条边的无向图,求最少去掉多少个点,可以使图不连通。如果不管去掉多少个点,都无法使原图不连通,则直接返回\(n\)。输......