#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
#define REP(x, n) for(int x = 0; x < n; x++)
#define FOR(x, b, e) for (int x = (b); x <= (e); x++)
#define LL long long
#define ULL unsigned long long
#define MP std::make_pair
#define ST first
#define ND second
#define MAX 406
typedef std::pair<int, int> PII;
typedef std::vector<int> VI;
std::vector<PII> deps;
int max_l[MAX];
int min_len;
//int arr[], int size
int compute_max_length(VI arr){
std::vector<PII>::iterator it;
REP(x, MAX){
max_l[x]=1;
}
// int i=0;
// REP(x, arr.size()){
// printf("VEC %d\n", arr[x]);
// }
for (it = deps.begin() ; it != deps.end(); ++it){
int st = (*it).ST;
int nd = (*it).ND;
bool exists = std::find(std::begin(arr), std::end(arr), st) != std::end(arr) || std::find(std::begin(arr), std::end(arr), nd) != std::end(arr);
// i++;
if (exists){
// printf("ZZZZ% d %d\n", (*it).ST, (*it).ND);
continue;
}
// printf("AAAA i%d %d %d\n", i, st, nd);
max_l[nd] = std::max(max_l[nd], max_l[st]+1);
max_l[0] = std::max(max_l[0], max_l[nd]);
}
// printf("MAX_L:\n");
// REP(x, 7)
// printf("%d ", max_l[x]);
// printf("\n");
return max_l[0];
}
void subset(int size, int left, int index, std::vector<int> &l){
if(left==0){
min_len = std::min(min_len, compute_max_length(l));
return;
}
for(int i=index; i<=size;i++){
l.push_back(i);
subset(size,left-1,i+1,l);
l.pop_back();
}
}
// int array[5]={1,2,3,4,5};
// list<int> lt;
// subset(array,5,3,0,lt);
// int gen(VI vector){
// while(vector[0] < m - vector.size()){
// std::vector<char> v
// }
// return compute_max_length(vector);
// }
int main() {
int n,m,k,a,b;
scanf("%d%d%d", &n, &m, &k);
REP(x, m){
scanf("%d%d", &a, &b);
deps.push_back(MP(a,b));
}
sort(deps.begin(), deps.end());
// REP(x,m){
// printf("%d %d\n", deps[x].ST, deps[x].ND);
// }
VI vec;
REP(x,k){
vec.push_back(x);
// printf("VEC %d\n", vec[x]);
}
VI lt;
min_len = compute_max_length(lt);
if(k == 0){
printf("%d\n", min_len);
return 0;
}
if(k == n){
printf("%d\n", 0);
return 0;
}
if(n - k == 1){
printf("%d\n", 1);
return 0;
}
subset(n,k,1,lt);
printf("%d\n", min_len);
// int r =gen(vec);
// REP(x,n+1){
// printf("%d\n", max_l[x]);
// }
return 0;
}
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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | #include <cstdio> #include <algorithm> #include <vector> #include <cmath> #define REP(x, n) for(int x = 0; x < n; x++) #define FOR(x, b, e) for (int x = (b); x <= (e); x++) #define LL long long #define ULL unsigned long long #define MP std::make_pair #define ST first #define ND second #define MAX 406 typedef std::pair<int, int> PII; typedef std::vector<int> VI; std::vector<PII> deps; int max_l[MAX]; int min_len; //int arr[], int size int compute_max_length(VI arr){ std::vector<PII>::iterator it; REP(x, MAX){ max_l[x]=1; } // int i=0; // REP(x, arr.size()){ // printf("VEC %d\n", arr[x]); // } for (it = deps.begin() ; it != deps.end(); ++it){ int st = (*it).ST; int nd = (*it).ND; bool exists = std::find(std::begin(arr), std::end(arr), st) != std::end(arr) || std::find(std::begin(arr), std::end(arr), nd) != std::end(arr); // i++; if (exists){ // printf("ZZZZ% d %d\n", (*it).ST, (*it).ND); continue; } // printf("AAAA i%d %d %d\n", i, st, nd); max_l[nd] = std::max(max_l[nd], max_l[st]+1); max_l[0] = std::max(max_l[0], max_l[nd]); } // printf("MAX_L:\n"); // REP(x, 7) // printf("%d ", max_l[x]); // printf("\n"); return max_l[0]; } void subset(int size, int left, int index, std::vector<int> &l){ if(left==0){ min_len = std::min(min_len, compute_max_length(l)); return; } for(int i=index; i<=size;i++){ l.push_back(i); subset(size,left-1,i+1,l); l.pop_back(); } } // int array[5]={1,2,3,4,5}; // list<int> lt; // subset(array,5,3,0,lt); // int gen(VI vector){ // while(vector[0] < m - vector.size()){ // std::vector<char> v // } // return compute_max_length(vector); // } int main() { int n,m,k,a,b; scanf("%d%d%d", &n, &m, &k); REP(x, m){ scanf("%d%d", &a, &b); deps.push_back(MP(a,b)); } sort(deps.begin(), deps.end()); // REP(x,m){ // printf("%d %d\n", deps[x].ST, deps[x].ND); // } VI vec; REP(x,k){ vec.push_back(x); // printf("VEC %d\n", vec[x]); } VI lt; min_len = compute_max_length(lt); if(k == 0){ printf("%d\n", min_len); return 0; } if(k == n){ printf("%d\n", 0); return 0; } if(n - k == 1){ printf("%d\n", 1); return 0; } subset(n,k,1,lt); printf("%d\n", min_len); // int r =gen(vec); // REP(x,n+1){ // printf("%d\n", max_l[x]); // } return 0; } |
English