大家一起玩游戏

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 26   Accepted Submission(s) : 2

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

n个小朋友一起玩游戏,但是他们中有些人互相讨厌,所以不愿一起玩游戏。而且对于每个小朋友,不会有超过2个讨厌的人。现在每个小朋友有个快乐值,问该怎样从n个小朋友中选出一些人,使他们中不会存在讨厌关系,且快乐值最大。

Input

第一行是case数T(1 <= T <= 100)

接下来有T组case,每组case有 n + 2 行

第一行有一个整数n(1 <= n <= 100) 表示有n个小朋友。

接下来n行,每行以整数k开始,表示第i个小朋友有k个讨厌的人,接着k个数表示他讨厌的小朋友编号。(1 <= k <= 2) 如果i讨厌j,这必然也有j讨厌i。

接下去一行有n个值,表示每个小朋友的快乐值。

Output

对每个case,输出最大的快乐值。

Sample Input

1
3
1 2
2 1 3
1 2
5 9 5

Sample Output

10

Source

hujie 测试专用(2)

     初看还以为是图上的最大独立集问题(权值都为1时)但是因为是k<=2 所以是多个环 或者 多个链的集合
并不是一个复杂的图,对于环路 和 简单链 直接DP即可
F[i][0] 表示不选第i个节点的前几个节点得到的最大值
F[i][1] 表示选第i个节点的前几个节点得到的最大值
F[i][0]=max(f[i-1][0],F[i][1])
F[i][1]=F[i][0]+wei[i]
环路增加一维判断第一个是否要选即可

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
using namespace std;
int MAP[103][3];
int wei[103];
int visit[103];
int F[103][3][3];
int n,m;
int temp;
int ans=0;
/* 定义变量区*/
void input()
{
    memset(F,0,sizeof(F));
    memset(visit,0,sizeof(visit));
    ans=0;
    memset(MAP,0,sizeof(MAP));
    /*初始化区*/
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&m);
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&temp);    
            MAP[i][j]=temp;
            MAP[i][0]++;
        }
    }
    for(int i=1;i<=n;i++)
    scanf("%d",&wei[i]);
}
void dfs(int pos,int deep)
{
    int OK=0;
    int t1=0,t2=0,I;
    for(int i=1;i<=MAP[pos][0];i++)
    {
        if(!visit[MAP[pos][i]])
        {
        OK=1;
        visit[MAP[pos][i]]=1;
        dfs(MAP[pos][i],deep+1);
        }
    }
    if(OK)
    {
    F[deep][0][0]=max(F[deep+1][0][0],F[deep+1][1][0]);
    F[deep][1][0]=F[deep+1][0][0]+wei[pos];
    }
    else
    {
    F[deep][0][0]=0;
    F[deep][1][0]=wei[pos];
    }
}
void init()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
}
void dfs2(int pos,int deep)
{
    int OK=0;
    int t1=0,t2=0,I;
    for(int i=1;i<=MAP[pos][0];i++)
    {
        if(!visit[MAP[pos][i]])
        {
        OK=1;
        visit[MAP[pos][i]]=1;
        dfs2(MAP[pos][i],deep+1);
        break;
        }
    }
    if(OK)
    {
    F[deep][0][0]=max(F[deep+1][0][0],F[deep+1][1][0]);
    F[deep][1][0]=F[deep+1][0][0]+wei[pos];
    F[deep][0][1]=max(F[deep+1][0][1],F[deep+1][1][1]);
    F[deep][1][1]=F[deep+1][0][1]+wei[pos];
    }
    else
    {
    F[deep][0][0]=0;
    F[deep][1][0]=-2100000000;
    F[deep][0][1]=0;
    F[deep][1][1]=wei[pos];
    }
}
int main()
{
//    init();
    int T;
    cin>>T;
    while(T--)
    {
        input();
        for(int i=1;i<=n;i++)
        {
        if(MAP[i][0]==1&&visit[i]==0)
        {
            visit[i]=1;
            dfs(i,1);
            ans+=max(F[1][0][0],F[1][1][0]);
            memset(F,0,sizeof(F));
        }
        }
        for(int i=1;i<=n;i++)
        {
        if(visit[i]==0)
        {
            visit[i]=1;
            dfs2(i,1);
            F[1][0][0]=max(F[1][0][0],F[1][1][0]);
            F[1][0][0]=max(F[1][0][0],F[1][0][1]);
            ans+=F[1][0][0];
            memset(F,0,sizeof(F));
        }
        }
        cout<<ans<<endl;
    }
    return 0;
}

在dfs的末尾 给F赋初值

并且在dfs之后更新F即可

【特殊的图+DP】【11月校赛】大家一起玩游戏的更多相关文章

  1. 2016年11月ACM/ICPC亚洲区北京赛赛后总结

    2016年11月12到11月13为期两天的比赛,这是我们这个对第一次去打亚洲区域赛,经过这次比赛,我认识到了自己与别人的差距,也许我们与别人的起点不同,但这不是理由. 这次的比赛12号的热身赛两点开始 ...

  2. 2014哈商大ICPC/ACM校赛解题报告

    被debug邀请去參加校赛,哎,被虐..我对不起工大.. 由于本人不搞ACM,算法处于HelloWorld水准.. 虽然题目除了鸟不拉屎星人之外都非常水,但我能做到这个程度,全然是超水平发挥了.. 数 ...

  3. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  4. 2014上半年acm总结(1)(入门+校赛)

    大一下学期才开始了acm,不得不说有一点迟,但是acm确实使我的生活充实了很多,,不至于像以前一样经常没事干=  = 上学期的颓废使我的c语言学的渣的一笔..靠考前突击才基本掌握了语法 寒假突然醒悟, ...

  5. HZNU第十二届校赛赛后补题

    愉快的校赛翻皮水! 题解 A 温暖的签到,注意用gets #include <map> #include <set> #include <ctime> #inclu ...

  6. Comet OJ 夏季欢乐赛 篮球校赛

    Comet OJ 夏季欢乐赛 篮球校赛 题目传送门 题目描述 JWJU注重培养学生的"唱,跳,rap,篮球"能力.于是每年JWJU都会举办篮球校赛,来给同学们一个切磋篮球技术的平台 ...

  7. 9.11 myl模拟赛

    9.11 myl 模拟赛 100 + 100 + 0 第一题耗费了太多的时间,导致最后一题没有时间想,直接去写了暴力,而且出题人没有给暴力分.... Problem 1. superman [题目描述 ...

  8. psp进度(11月25号-31号)

    本周psp进度 11月25号 内容 开始时间 结束时间 打断时间 净时间 处理数据集  9:27  11:34  12m  115m 11月27号 内容 开始时间 结束时间 打断时间 净时间  scr ...

  9. 本周psp(11月17-23)

    本周psp进度 11月19号 内容 开始时间 结束时间 打断时间 净时间 发布读书笔记 11:05 11:25 0 20m 看构建之法书 9:50 10:48 5m 53m 11月20号 内容 开始时 ...

随机推荐

  1. input输入字母自动大小写转换

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  2. 《JavaScript 闯关记》之基本包装类型

    为了便于操作基本类型值,JavaScript 还提供了3个特殊的引用类型:Boolean.Number 和 String.实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象 ...

  3. 失效的URL访问限制(转)

    * 经常URL的保护仅仅是连接到该页面的链接不出现在未授权的用户面前.然而,一个有动机的.熟练的或者仅仅是幸运的黑客可能会找到并访问这些网页 , 调用这些功能并查看数据.在应用程序中,通过隐匿来实现安 ...

  4. Code Complete 读后总结和新的扩展阅读计划

    Code Complete 读后总结和新的扩展阅读计划 用了一年时间终于将代码大全读完了,在这里做一个简单的总结,并安排下一阶段的扩展阅读计划. 1.选择代码大全作为我程序员职业入门的第一本书,我认为 ...

  5. SQL日期形式转换

    在SQL Server中,有时存储在数据库中的日期格式和我们需要显示在页面上的格式不相同,我们需要转化成需要的格式. 特在此总结了一下常用的日期格式. --当前时间 SELECT GETDATE(); ...

  6. COMException 依赖服务或组无法启动(0x8007042C)处理办法

    问题分析:这个问题主要原因是由于服务列表中的windows management instrumentation这个服务无法启动 问题解决办法: 点击屏幕左下角:开始-运行-输入regedit 打开注 ...

  7. 写一个Windows上的守护进程(5)文件系统重定向

    写一个Windows上的守护进程(5)文件系统重定向 在Windows上经常操作文件或注册表的同学可能知道,有"文件系统/注册表重定向"这么一回事.大致来说就是32位程序在64位的 ...

  8. hdu just a hook(线段树,区间修改)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. Effective Java设定游戏 - 就是爱Java

    首先,我们先设定游戏,一个网页游戏的基本场景,主角拥有各种能力,但一开始数值都只有系统初始,随着故事的发展,会接触到各种不同的场景,获得提升角色的道具与装备,来参与更高难度的任务. 阅读全文>& ...

  10. C# Process类_进程_应用程序域与上下文之间的关系

    进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.进程之间是相对独立的,一个进程无法直接访问另一个进程的数据(除非分布式),一个进程运行的失败也不会影响其他 ...