POJ1463Strategic game[树形DP]

来源:互联网 发布:淘宝西装原单 编辑:程序博客网 时间:2024/06/06 00:21

题目大意是:
有一颗树,n个节点,问,最少用几个点,让所有的点与它们中任意一个相邻

#include <cctype>#include <cerrno>#include <cfloat>#include <ciso646>#include <climits>#include <clocale>#include <cmath>#include <csetjmp>#include <csignal>#include <cstdarg>#include <cstddef>#include <cstdio>#include <cstdlib>#include <cstring>#include <ctime>#include <algorithm>#include <bitset>#include <complex>#include <deque>#include <exception>#include <fstream>#include <functional>#include <iomanip>#include <ios>#include <iosfwd>#include <iostream>#include <istream>#include <iterator>#include <limits>#include <list>#include <locale>#include <map>#include <memory>#include <new>#include <numeric>#include <ostream>#include <queue>#include <set>#include <sstream>#include <stack>#include <stdexcept>#include <streambuf>#include <string>#include <typeinfo>#include <utility>#include <valarray>#include <vector>using namespace std;//头文件有点丑,别在意vector<int>a[1510];//动态数组代替链式前项星int f1[1510],f0[1510];int dfs(int x){    int d;    f0[x]=0;    f1[x]=1;    for(int i=0;i<a[x].size();i++){        d=a[x][i];        dfs(d);        f0[x]+=f1[d];        f1[x]+=min(f1[d],f0[d]);//DP    }    return min(f0[x],f1[x]);}int main(){    int n,i,g,m,x,y;    while(cin>>n){        memset(f1,0,sizeof(f1));        memset(f0,0,sizeof(f0));        for(i=0;i<=n;i++)            a[i].clear();        g=-1;        for(i=1;i<=n;i++){            scanf("%d:(%d)",&x,&m);//输入            if(g==-1)g=x;            for(;m;m--){                cin>>y;                a[x].push_back(y);            }        }        cout<<dfs(g)<<endl;    }    return 0;}
2 0
原创粉丝点击