|
|
注意一点:用链表存储树。
差点就悲剧了 限时2000ms 我的程序跑了1700+ 险!
#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define maxn 1505 bool vis[maxn],son[maxn];int min(int a,int b){return a<b?a:b;}int n;int dproot[maxn],all[maxn];int head[maxn],len;class node{public:int v,next;};void solve(int root,node g[]){int i,minnode=0;vis[root]=false;if(son[root]){dproot[root]=1;all[root]=0;return ;}for(i=head[root];i;i=g[i].next ){int v=g[i].v ;if(vis[v]) solve(v,g); dproot[root]+=all[v];minnode+=dproot[v];}dproot[root]+=1;all[root]=min(dproot[root],minnode);}void create(int root,int temp,node g[]){g[++len].v=temp;g[len].next=head[root];head[root]=len;}int main(){int i,k,j,root,temp;char a,b,c;while(scanf("%d",&n)!=EOF){node g[maxn*3];len=0;memset(head,0,sizeof(head));memset(vis,true,sizeof(vis));memset(son,true,sizeof(son));memset(dproot,0,sizeof(dproot));memset(all,0,sizeof(all));for(i=1;i<=n;i++){cin>>root>>a>>b>>k>>c;for(j=0;j<k;j++){cin>>temp;vis[temp]=false;create(root,temp,g);son[root]=false;}}for(i=0;i<n;i++)if(vis[i]) {temp=i;break;}memset(vis,true,sizeof(vis));solve(temp,g);printf("%d\n",all[temp]);}return 0;} |
|