codevs1380 没有上司的舞会 树上dp

来源:互联网 发布:北京网络推广培训 编辑:程序博客网 时间:2024/05/16 08:00

大家都很强,可与之共勉。

一道非常弱的树上DP,状态f[i][0]表示i没到,f[i][1]表示i到了。
转移方程显而易见。

#include "cctype"#include "cstdio"#define max(a, b)  ((a) > (b) ? (a) : (b))#define atoi(x)   x - 48template<typename T>inline bool readIn(T &x)  {    x = 0;    T flag = 1;    char ch;    while( !isdigit(ch = (char) getchar()) )  if(ch == '-')  flag = -1;    x = atoi(ch);    while( isdigit(ch = (char) getchar()) )        x = (x << 1) + (x << 3) + atoi(ch);    x *= flag;}template<typename T>inline void write( T x )  {    if(x > 9)        write(x / 10);    putchar(x % 10 + 48);}template<typename T>inline bool writeIn(T x)  {    if(x < 0)  {        x = -x;        putchar('-');    }    write(x);}int f[6005][2], head[6005], indgr[6005], n, ne;struct edge  {    int to, pre;    edge(int to = 0, int pre = 0) : to(to), pre(pre)  { }}g[6005];inline bool adde(int u, int v)  {    g[++ne] = edge(v, head[u]), head[u] = ne;}void dfs(int u)  {    for(int i = head[u]; i; i = g[i].pre)  {        int v = g[i].to;        dfs(v);        f[u][0] += max(f[v][1], f[v][0]);        f[u][1] += f[v][0];    }}int main()  {    readIn(n);    for(register int i = 1; i <= n; readIn(f[i][1]), ++i);    int u, v;    do  {        readIn(u);readIn(v);        adde(v, u);        ++indgr[u];    } while(u && v);    for(register int i = 1; i <= n; ++i)        if(!indgr[i])  {            dfs(i);            writeIn(max(f[i][0], f[i][1]));            putchar('\n');            return 0;        }}
0 0
原创粉丝点击