目录
A求悬挂顶点
本题考查握手定理,各顶点的度数之和等于边数的二倍
(在离散课本P134)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,t,m;
scanf("%d %d",&m,&t);
printf("%d\n",2*m-t*20);
return 0;
}
B计算连通分支
平面图的连通分支,直接运用公式n-m+r=k+1;
n是顶点数,m是边数,r是面数,k是连通分支个数。
(离散课本P159)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,m,r;
scanf("%d %d %d",&n,&m,&r);
printf("%d\n",n-m+r-1);
return 0;
}
C二元完全正则树
设T为一棵平凡树的树根
树高h(T):层数最大顶点的层数
r元树:T的每个分支点最多有r个儿子
r元正则树:T的每个分支点都恰有r个儿子
r元完全正则树:T是r元正则树,且所有树叶的层数均为树高h(T)
(离散课本P178)
稍稍分析一下能够得到规律,也就是:
顶点数n=2^(h+1)-1
边数m=2^(h+1)-2;
树叶t=2^h
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int h,n,m,t;
scanf("%d",&h);
n=(int)pow(2.0,h+1)-1;
m=(int)pow(2.0,h+1)-2;
t=(int)pow(2.0,h);
printf("%d %d %d\n",n,m,t);
return 0;
}
D非降路径
直接套用公式
从点(a,b)到(c,d)的非降路径数为 C(c-a+d-b,c-a) 或 C(c-a+d-b,d-b) 组合数
(离散课本P199)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,b,c,d,n,m,i;
int s1,s2,s3;
while(scanf("%d %d %d %d",&a,&b,&c,&d)!=-1)
{
//s1=(c+d-a-b)! s2=(c-a)! s3=(d-b)!
s1=s2=s3=1;
//计算C(m,n)
m=c+d-a-b;
n=c-a;
for(i=1;i<=m;i++)
s1*=i;
for(i=1;i<=n;i++)
s2*=i;
for(i=1;i<=m-n;i++)
s3*=i;
printf("%d\n",s1/(s2*s3));
}
return 0;
}
E错位排列
错位排列数递推方程:
D(n)=(n-1)*(D(n-2)+D(n-1))
D(1)=0 , D(2)=1
(离散课本P211)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i,a[15];
scanf("%d",&n);
a[1]=0;
a[2]=1;
for(i=3;i<=10;i++)
{
a[i]=(i-1)*(a[i-2]+a[i-1]);
}
printf("%d\n",a[n]);
return 0;
}