问题描述
何老板养了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