#define _USE_MATH_DEFINES/////////////////////////////////////////////////////
#include <bits/stdc++.h>//////////////////////////////////////////////////////
#ifdef LOC////////////////////////////////////////////////////////////////////
#include "debuglib.h"/////////////////////////////////////////////////////////
#else/////////////////////////////////////////////////////////////////////////
#define deb(...)//////////////////////////////////////////////////////////////
#define DBP(...)//////////////////////////////////////////////////////////////
#endif////////////////////////////////////////////////////////////////////////
#define x first///////////////////////////////////////////////////////////////
#define y second//////////////////////////////////////////////////////////////
#define mp make_pair//////////////////////////////////////////////////////////
#define pb push_back//////////////////////////////////////////////////////////
#define sz(x)int((x).size())//////////////////////////////////////////////////
#define each(a,x)for(auto&a:(x))//////////////////////////////////////////////
#define all(x)(x).begin(),(x).end()///////////////////////////////////////////
#define rep(i,b,e)for(int i=(b);i<(e);i++)////////////////////////////////////
using namespace std;using namespace rel_ops;using ll=int64_t;using Pii=pair///
<int,int>;using ull=uint64_t;using Vi=vector<int>;void run();int main(){cin.//
sync_with_stdio(0);cin.tie(0);cout<<fixed<<setprecision(20);run();return 0;}//
//--------------------------------------------------------------------------//
struct Vert {
Vi in;
int len{1};
};
vector<Vert> G;
int ans = INT_MAX;
Pii maxPath() {
Pii ret = {0, -1};
rep(i, 0, sz(G)) if (G[i].len) {
int tmp = 0;
each(e, G[i].in) tmp = max(tmp, G[e].len);
G[i].len = tmp+1;
ret = max(ret, mp(tmp+1, i));
}
return ret;
}
void solve(int remain) {
Vi path;
int len, vert;
tie(len, vert) = maxPath();
ans = min(ans, len);
if (remain <= 0) return;
while (true) {
path.pb(vert);
if (G[vert].len <= 1) break;
each(e, G[vert].in) if (G[e].len+1 == G[vert].len) {
vert = e;
break;
}
}
each(v, path) {
G[v].len = 0;
solve(remain-1);
G[v].len = 1;
}
}
void run() {
int n, m, k; cin >> n >> m >> k;
G.resize(n);
rep(i, 0, m) {
int a, b; cin >> a >> b;
G[b-1].in.pb(a-1);
}
solve(k);
cout << ans << endl;
}
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 | #define _USE_MATH_DEFINES///////////////////////////////////////////////////// #include <bits/stdc++.h>////////////////////////////////////////////////////// #ifdef LOC//////////////////////////////////////////////////////////////////// #include "debuglib.h"///////////////////////////////////////////////////////// #else///////////////////////////////////////////////////////////////////////// #define deb(...)////////////////////////////////////////////////////////////// #define DBP(...)////////////////////////////////////////////////////////////// #endif//////////////////////////////////////////////////////////////////////// #define x first/////////////////////////////////////////////////////////////// #define y second////////////////////////////////////////////////////////////// #define mp make_pair////////////////////////////////////////////////////////// #define pb push_back////////////////////////////////////////////////////////// #define sz(x)int((x).size())////////////////////////////////////////////////// #define each(a,x)for(auto&a:(x))////////////////////////////////////////////// #define all(x)(x).begin(),(x).end()/////////////////////////////////////////// #define rep(i,b,e)for(int i=(b);i<(e);i++)//////////////////////////////////// using namespace std;using namespace rel_ops;using ll=int64_t;using Pii=pair/// <int,int>;using ull=uint64_t;using Vi=vector<int>;void run();int main(){cin.// sync_with_stdio(0);cin.tie(0);cout<<fixed<<setprecision(20);run();return 0;}// //--------------------------------------------------------------------------// struct Vert { Vi in; int len{1}; }; vector<Vert> G; int ans = INT_MAX; Pii maxPath() { Pii ret = {0, -1}; rep(i, 0, sz(G)) if (G[i].len) { int tmp = 0; each(e, G[i].in) tmp = max(tmp, G[e].len); G[i].len = tmp+1; ret = max(ret, mp(tmp+1, i)); } return ret; } void solve(int remain) { Vi path; int len, vert; tie(len, vert) = maxPath(); ans = min(ans, len); if (remain <= 0) return; while (true) { path.pb(vert); if (G[vert].len <= 1) break; each(e, G[vert].in) if (G[e].len+1 == G[vert].len) { vert = e; break; } } each(v, path) { G[v].len = 0; solve(remain-1); G[v].len = 1; } } void run() { int n, m, k; cin >> n >> m >> k; G.resize(n); rep(i, 0, m) { int a, b; cin >> a >> b; G[b-1].in.pb(a-1); } solve(k); cout << ans << endl; } |
English