p5140大吉大利 晚上吃鸡

问题描述

何老板养了n只鸡(编号1到n)。何老板打算从今天开始,连续m晚都吃鸡。
每晚,何老板会选一对指定编号的鸡出来。若两只鸡都活着,那么他会随便吃掉其中一只;若只有一只活着,另一只之前已经被吃了,就吃还活着那只;若两只鸡都已被吃掉了,当晚就不吃鸡。
何老板想知道,m天后,可能有多少对鸡同时活着?请你帮他算一算。(如果一对鸡存活的概率>0,我们认为他们可能活着)

输入格式

第一行,两个整数n和m
接下来m行,每行两个整数x和y,第i行表示第i天选出的两只鸡的编号。

输出格式

一行,一个整数,表示最后还存活的鸡的对数。

样例输入 1

3 1
1 2

样例输出 1

2

样例输入 2

4 3
1 2
3 4
2 3

样例输出 2

1

样例输入 3

3 2
1 2
1 2

样例输出 3

0

样例输入 4

10 10
8 9
2 8
4 6
4 9
7 8
2 8
1 8
3 4
3 4
2 7

样例输出 4

5

提示

2≤N≤400
1≤M≤10^5

样例1说明:
如果第1晚吃2,那么(1,3)这对鸡还活着
如果第1晚吃1,那么(2,3)这对鸡还活着

样例2说明:
(1, 4) 这对鸡活着,如果采用的是下列吃鸡方式:
第1晚吃2号鸡
第2晚吃3号鸡
第3晚没得吃

分析
从后向前讨论,讨论假如某只鸡不死需要的条件。
那么要保证与它在一起的鸡都死亡,即之前未死。
 1 //
 2 #include<stdio.h>
 3 #include<bits/stdc++.h>
 4 using namespace std;
 5 int a[100005],b[100005],dead[405],Liveset[405][405];
 6 int n,m,ans;
 7 int main()
 8 {
 9     cin>>n>>m;
10     for(int i=1;i<=m;i++)cin>>a[i]>>b[i];
11     for(int i=1;i<=n;i++)
12     {
13         Liveset[i][i]=1;
14         for(int j=m;j>0;j--)
15         {
16             int x=Liveset[i][a[j]];
17             int y=Liveset[i][b[j]];
18             if(x&&y)
19             {
20                 dead[i]=true;
21                 break;
22             }
23             else
24             {
25                 if(x)Liveset[i][b[j]]=1;
26                 if(y)Liveset[i][a[j]]=1;
27             }
28         }
29     }
30     for(int i=1;i<+n;i++)
31     {
32         if(dead[i])continue;
33         for(int j=i+1;j<=n;j++)
34         {
35             if(dead[j])continue;
36             int tmp=1;
37             for(int k=1;k<+n;k++)
38             {
39                 if(Liveset[i][k]&&Liveset[j][k])
40                 {
41                     tmp=0;
42                     break;
43                 }
44             }
45             ans+=tmp;
46         }
47     }
48     cout<<ans;
49 }
50     
51     
52     
原文地址:https://www.cnblogs.com/CXYscxy/p/11058870.html