1 条题解

  • 0
    @ 2024-12-24 9:54:33

    C++ :

    /*====================
    AUTHOR:MOSHANGYIN
    TYPE:TREE DP
    TITLE:REBUILD ROADS
    ====================*/
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    using namespace std;
    vector<int> g[155];
    int n,p,x,y,id[155]={0};
    int f[155][155]={0};
    inline int in()
    {
    	char c=getchar();
    	int x=0;
    	while(c<'0'||c>'9')
    	{
    	 	c=getchar();
    	}
    	for(;c>='0'&&c<='9';c=getchar())
    	{
    	 	x=x*10+c-'0';
    	}
    	return x;
    }
    void dp(int x)
    {
    	f[x][1]=0;
    	for(int i=0;i<g[x].size();i++)
    	{
    		dp(g[x][i]);
    		for(int j=p;j>=1;j--)
    		{
    			f[x][j]++;
    			for(int k=1;k<j;k++)
    			{
    				f[x][j]=min(f[x][j],f[g[x][i]][j-k]+f[x][k]);
    			}
    		}
    	}
    }
    int main()
    {
    	n=in(),p=in();
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=p;j++)
    		{
    			f[i][j]=100001;
    		}
    	} 
    	for(int i=1;i<n;i++)
    	{
    		x=in(),y=in();
    		id[y]++;
    		g[x].push_back(y);
    	}
    	for(int i=1;i<=n;i++)
    	{
    		if(id[i]==0)
    		{
    			dp(i);
    			int ans=f[i][p];
    			for(int i=1;i<=n;i++)
    			{
    				ans=min(ans,f[i][p]+1); 
    			}
    			printf("%d\n",ans);
    			break;
    		}
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    1233
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者