不是VIP会员,不能显示答案

题目解答

题目:
阅读下面一段程序,完成(1)-(5)五道小题。



对于图G=(V,E),我们定义它的线图L(G)为一张|E|个点的无向图,满足:

*原图G中的边e对应L(G)中的一个点u。

*L(G)中点u,v之间有连边,当且仅当G中u,v对应的边有公共的顶点。

下图展示了如何通过G构造出L(G)。



现在,给定一棵树T,你需要计算出它的k阶线图 L'(T) 的点数。

输入格式:输入的第一行包含两个整数n,k。接下来n-1行,每行两个整数u,v,描述树中的一条边。

输出格式:输出一行一个整数,表示答案。

数据范围:1≤k≤5,1≤n≤50。

#include<bits/stdc++.h>



const int N=5e3+7;

int n,k,d[N];

std::vector<int>p[N];

bool e[N][N];



int main() {

scanf ("%d%d", &n,&k);

--n;

for (int i=1,x,y; i<=n; i++)

{

scanf ("%d%d",&x,&y);

for (int j:p[x]) e[i][j]=e[j][i]=1;

for (int j:p[y]) e[i][j]=e[j][i]=1;

___(1)__;

}

int ans=0;

if (k==2)

{

for (int i=1; i<=n; i++)

for (int j=1; j<=n; j++)

___(2)__;

___(3)__;

}

else if (k==3)

{

for (int i=1; i<=n; i++)

for (int j=1; j<=n; j++)

d[i]+=e[i][j];

for (int i=1; i<=n; i++) ___(4)__;

}

else if (k==4)

{

for (int i=1; i<=n; i++)

for (int j=1; j<=n; j++) d[i]+=e[i][j];

for (int i=1; i<=n; i++)

for (int j=1; j<=n; j++)

if (e[i][j])

___(5)__;

ans /=4;

}

else if (k==5)

{

for (int i=1; 1<=n; i++)

for (int j=1; j<=n; j++) d[i]+=e[i][j];

static int c[N][N];

for (int i=1; 1<=n; i++) {



int x1=0,x2=0;

for (int j=1; j<=n; j++)

if(e[i][j])

c[i][j]=d[i]+d[j]-3, x1+=c[i][j],x2+=c[i][j]*c[i][j];

for (int j=1; j<=n; j++)

if (e[i][j])

ans+=(d[i]-1)+c[i][j]+e[i][j], ans+-2*c[i][j]*(x1-c[i][j]),ans+=x2-c[i][j]*e[i][j], ans-=(d[i]-1)*c[i][j], ans-=x1-c[i][j];

}

ans /=4;

}

printf ("%d",ans);

return 0;

}


选择题

1) ⑴处应填( )。

2) ⑵处应填( )。

3) ⑶处应填( )。

4) ⑷处应填( )。

5) ⑸处应填( )。
考点:
分析:
解答:
评论:
老师: