应该是躶体吧 dp【i】【1】 表示在这个点不放dp【i】【2】 表示放
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int edge[1510][1510]; int mark[1510],dp[1510][3]; int min(int a,int b) { return a<b?a:b; } int dfs(int t) { int i; if(edge[t][0]==0) { dp[t][2]=1; return 0; } for(i=1;i<=edge[t][0];i++) { int x=edge[t][i]; dfs(x); } int sum1=0,sum2=0; for(i=1;i<=edge[t][0];i++) { int x=edge[t][i]; sum1+=dp[x][2]; sum2+=min(dp[x][1],dp[x][2]); } dp[t][1]=sum1; dp[t][2]=sum2+1; return 0; } int main() { int n,i,j,a,b; char str[10]; while(~scanf("%d",&n)) { memset(edge,0,sizeof(edge)); memset(mark,0,sizeof(mark)); memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) { scanf("%d:(%d)",&a,&b); edge[a][0]=b; for(j=1;j<=b;j++) { int c; scanf("%d",&c); mark[c]=1; edge[a][j]=c; } } for(i=0;i<n;i++) if(!mark[i]) break; j=i; dfs(i); printf("%d\n",min(dp[i][1],dp[i][2])); } return 0; }
时间: 2024-10-12 15:50:28