lightoj 1201 裸树形dp

“Yes, I am the murderer. No doubt” I had to confess it in front of all. But wait, why I am confessing? Nobody wants to go to jail, neither do I. As you have suspected there is something fishy. So, let me explain a bit.

The murder was happened in 19th June, at 11:30 pm this year (2009) according to the medical report. So, I was asking the judge “Can you find the time 19th June 11:30 pm in Bangladesh?” The judge informed other reporters to find the time. But alas! There was no time - “2009, 19th June, 11:30 pm”. So, the judge got a bit confused about my confession. So, I began to tell them, “The time the murder was happened, is not a valid time according to you. So, how can you claim that I am the murderer?”

And what happened next, you all know. I am in the streets again with a clean sheet.

But now I have planned to kill again. I have a list of N mosquitoes which are to be killed. But there is a small problem. If I kill a mosquito, all of his friends will be informed, so they will be prepared for my attack, thus they will be impossible to kill. But there is a surprising fact. That is if I denote them as a node and their friendship relations as edges, the graph becomes acyclic.

Now I am planning when and how to kill them (how to get rid of the law!) and you have to write a program that will help me to find the maximum number of mosquito I can kill. Don’t worry too much, if anything goes wrong I will not mention your name, trust me!

Input
Input starts with an integer T (≤ 50), denoting the number of test cases.

Each case starts with a blank line and two integers N (1 ≤ N ≤ 1000) denoting the number of mosquito I want to kill and M denoting the number of friendship configurations. Each of the next M lines contains two integers a and b denoting that ath and bth mosquitoes are friends. You can assume that (1 ≤ a, b ≤ N, a ≠ b) and each friendship relation is given only once. As I have already mentioned, you will not find any cycle in the relations.

Output
For each case, print the case number and the maximum number of mosquitoes I can kill considering the conditions described above.

Sample Input
Output for Sample Input
3

4 3
1 2
1 3
1 4

3 2
1 2
2 3

5 4
1 2
1 3
2 4
2 5
Case 1: 3
Case 2: 2
Case 3: 3

很简单的树形dp…
别忘了在状态转移的时候加上自己就可以了~
第一次在light oj上做题…

#include<iostream>
#include<cmath>
#include<string>
#include<vector>
#include<memory.h>
#include<algorithm>
#include<cstdio>
using namespace std;
int biaoji[1001];
int dp[1001][2];
int n,m;
int jilu[1001];
vector<int> li[1001];
void dfs(int gen)
{
    biaoji[gen]=1;
    if(jilu[gen]==0)
    {
        dp[gen][0]=0;
        dp[gen][1]=1;
        return;
    }
    int sum0=0;
    int sum1=0;
    for(int a=0;a<li[gen].size();a++)
    {
        if(biaoji[li[gen][a]]==0)
        {
            jilu[li[gen][a]]--;
            dfs(li[gen][a]);
            sum0+=max(dp[li[gen][a]][0],dp[li[gen][a]][1]);
            sum1+=dp[li[gen][a]][0];
        }
    }
    dp[gen][0]=sum0;
    dp[gen][1]=sum1+1;
}
int main()
{
    int T;
    cin>>T;
    int u=0;
    while(T--)
    {
        memset(biaoji,0,sizeof(biaoji));
        memset(dp,0,sizeof(dp));
        memset(jilu,0,sizeof(jilu));
        for(int a=1;a<=n;a++)li[a].clear();
        //cout<<endl;
        cin>>n>>m;
        int l,k;
        for(int a=1;a<=m;a++)
        {
            scanf("%d%d",&l,&k);
            li[l].push_back(k);
            jilu[l]++;
            li[k].push_back(l);
            jilu[k]++;
        }
        int sum=0;
        for(int a=1;a<=n;a++)
        {
            if(biaoji[a]==0)
            {
                dfs(a);
                sum+=max(dp[a][0],dp[a][1]);
            }
        }
        printf("Case %d: %d\n",++u,sum);
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值