30分 只有第二问寄了 玄关!!!
查看原帖
30分 只有第二问寄了 玄关!!!
989997
DGL__DGL_AFO楼主2024/9/1 07:18

评测寄录

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,k;
int h[214514],e[414514],ne[414514],idx;
ll st[214514],w[214514],g[214514][3];
ll f[214514][114],mod=1e9+7,ans;
ll op[214514],cnt=1e18;

inline void add(int a,int b,int c)
{
	idx++;
	ne[idx]=h[a];
	e[idx]=b;
	w[idx]=c;
	h[a]=idx;
}

inline void dfs(int x)
{
	st[x]=1;
	int ff=0,op,res=1;
	for(int i=h[x];i;i=ne[i])
	{
		int y=e[i];
		
		if(!st[y])
		{
			dfs(y);
			ll aa=1e18,aaa=0;
			ll bb=1e18;
			if(w[i]==0)
			{
				for(int j=1;j<=k;j++)
				{
					if(aa>g[y][j])
					{
						bb=aa;
						aa=g[y][j];
						aaa=j;
					}
					else if(bb>g[y][j])
						bb=g[y][j];
					
				}
				for(int j=1;j<=k;j++)
				{
					if(j!=aaa)
				  	g[x][j]+=aa;
					else
					  g[x][j]+=bb;
				}
				  
			}
			else if(w[i]==1)
			{
				for(int j=1;j<=k;j++)
				  aa=min(aa,g[y][j]);
				for(int j=1;j<=k;j++)
				  g[x][j]+=aa;
			}
			else
			{
				for(int j=1;j<=k;j++)
			  	g[x][j]+=g[y][j];
			
			}
			
			ff++;
			ll res=0;
			for(int j=1;j<=k;j++)
				res+=f[y][j];
			res%=mod;		
				
			
			if(w[i]==0)	
			{
				for(int j=1;j<=k;j++) 
				  f[x][j]=f[x][j]*((res-f[y][j]+mod)%mod)%mod;	  
		  }     
			else if(w[i]==1)
			{
				for(int j=1;j<=k;j++)
          f[x][j]=f[x][j]*res%mod;
  		}
  		else
  		{
  			for(int j=1;j<=k;j++)
  			  f[x][j]=f[x][j]*f[y][j]%mod;
			}
			  
		}
	}
	
	for(int i=1;i<=k;i++)
		g[x][i]+=i;
		
	
}


int main()
{
	//memset(g,0x3f,sizeof g);
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=k;j++)
	    f[i][j]=1;
	    
	for(int i=1;i<=n-1;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		add(a,b,c);
		add(b,a,c);
	}
	
	
	dfs(1);
	for(int i=1;i<=k;i++)
	  ans=(ans+f[1][i])%mod;
	
	/*for(int i=1;i<=n;i++)  
	  cout<<i<<' '<<op[i]<<'\n';
	cout<<endl;*/  
	ans%=mod;
	if(ans==0)
	{
		cout<<0<<' '<<0;
		return 0;
	}
	
	cnt=1e18;
	for(int i=1;i<=k;i++)
	  cnt=min(cnt,g[1][i]);  
	cout<<ans<<' '<<cnt;
	

	return 0;
}
2024/9/1 07:18
加载中...