1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <bits/stdc++.h>
using namespace std;

int n,m,k;
int out=1000;
vector < int > v[305];
vector < int > post;
int a,b;
bool odw[305];
bool done[305];
void dfs(int node)
{
	odw[node]=1;
	for(auto it: v[node])
		{
			if(odw[it]==0)
				dfs(it);
		}
	post.push_back(node);
}
vector < pair < int , int > > naj(bool xd[])
{
	vector < pair < int , int > > wek;
	wek.assign(n+1,{0,0});
	for(int i=0;n>i;i++)
	{
		int node=post[i];
		if(xd[node]==1)
			continue;
		wek[node].first=1;
		for(auto it: v[node])
			{
				if(xd[it]==0)
					if(wek[it].first+1>wek[node].first)
					{
						wek[node].first=wek[it].first+1;
						wek[node].second=it;
					}
			}
	}
	return wek;
}
void rek(int ile, bool t[])
{
		vector < pair < int , int > > jazda=naj(t);
		int maks=0;
		int ind=0;
		for(int i=1;n>=i;i++)
		{
			if(jazda[i].first>maks)
			{
				maks=jazda[i].first;
				ind=i;
			}
		}
		if(ile==k)
		{
			out=min(maks,out);
			return ;
		}
		vector < int > path;
		while(23>22)
		{
			path.push_back(ind);
			if(jazda[ind].second==0)
				break;
			ind=jazda[ind].second;
		}
		for(int i=0;path.size()>i;i++)
		{
			t[path[i]]=1;
			rek(ile+1,t);
			t[path[i]]=0;
		}
}
int main()
{
		//cin.tie(0);
		//ios_base::sync_with_stdio(0);
		scanf("%d%d%d",&n,&m,&k);
		for(int i=0;m>i;i++)
		{
			scanf("%d%d",&a,&b);
			v[a].push_back(b);
		}
		for(int i=1;n>=i;i++)
			if(odw[i]==0)
				dfs(i);

		rek(0,done);
		printf("%d",out);
		return 0;
}