Pagini recente » Cod sursa (job #2340762) | Cod sursa (job #177641) | Cod sursa (job #1535967) | Cod sursa (job #3265967) | Cod sursa (job #1629678)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <bitset>
using namespace std;
const short nmax = 105;
const short mod = 30011;
vector <short> g[nmax], gt[nmax];
short n, k, dist[nmax], v[nmax], rila;
void bfs1()
{
vector <short> :: iterator son;
queue <short> q;
short dad, i;
fill(dist+1, dist+n+1, 3e4);
for(i=1; i<=n; i++)
if(g[i].size()==0)
{
dist[i]=k;
q.push(i);
}
while(!q.empty())
{
dad=q.front();
q.pop();
for(son=gt[dad].begin(); son!=gt[dad].end(); son++)
if(dist[*son] > dist[dad]-1)
{
dist[*son]=dist[dad]-1;
q.push(*son);
}
}
}
void bfs2()
{
vector <short> :: iterator son;
queue <short> q;
short dad, i;
for(i=1; i<=n && !rila; i++)
if(gt[i].size()==0) rila=i;
v[rila]=dist[rila];
q.push(rila);
while(!q.empty())
{
dad=q.front();
q.pop();
for(son=g[dad].begin(); son!=g[dad].end(); son++)
{
v[*son]=dist[*son]-dist[dad];
q.push(*son);
}
}
}
int comb(int c,int k)
{
if (k==0) return 1;
else if (k>c) return 0;
else return ((comb(c-1, k)+comb(c-1, k-1))%mod);
}
int main()
{
freopen("iepuri2.in", "r", stdin);
freopen("iepuri2.out", "w", stdout);
short i, x, y, sol=0, nr=0;
scanf("%hd %hd", &n, &k);
for(i=1; i<n; i++)
{
scanf("%hd %hd", &x, &y);
g[x].push_back(y);
gt[y].push_back(x);
}
bfs1();
bfs2();
for(i=1; i<=n; i++)
if(g[i].size()==0)
{
sol=(sol+v[i])%mod;
nr++;
}
if(v[rila] > 1) sol=(sol+comb(nr, v[rila-1]))%mod;
else if(v[rila] <= 0) sol=0;
printf("%hd", sol);
fclose(stdin);
fclose(stdout);
return 0;
}