#include <stdio.h> #include <stdlib.h> #define MAXK 5 #define MAXN 310 #define MAXM 410 typedef struct { int f, t; int n; } t_edge; int ie = 0; t_edge e[MAXM]; int f[MAXN]; int ir = 0; int d[MAXN]; int revd[MAXN]; int out[MAXN]; int longestStart[MAXK][MAXN]; int longestEnd[MAXK][MAXN]; int xmax(int a, int b) { return (a>b) ? a : b; } int xmin(int a, int b) { return (a<b) ? a : b; } void go_dfs(int n) { if (d[n]!=-1) return ; int ix = f[n]; while (ix!=-1) { go_dfs(e[ix].t); ix = e[ix].n; } d[n] = ir++; } void go_start(int k, int n) { if (out[n]) return ; int ix = f[n]; while (ix!=-1) { if (!out[e[ix].t]) longestStart[k][n] = xmax(longestStart[k][n], 1+longestStart[k][e[ix].t]); ix = e[ix].n; } } void go_end(int k, int n) { if (out[n]) return ; int ix = f[n]; while (ix!=-1) { if (!out[e[ix].t]) longestEnd[k][e[ix].t] = xmax(longestEnd[k][e[ix].t], 1+longestEnd[k][n]); ix = e[ix].n; } } int go(int k, int n) { int i, mm, v; int ex[MAXN]; for (i=0;i<n;i++) longestStart[k][i] = longestEnd[k][i] = 0; for (i=0;i<n;i++) go_start(k, revd[i]); for (i=n-1;i>=0;i--) go_end(k, revd[i]); mm = 0; for (i=0;i<n;i++) if (!out[i]) mm = xmax(mm, longestStart[k][i]+longestEnd[k][i]+1); if (k==0) { //printf("V=%d\n", mm); return mm; } for (i=0;i<n;i++) if (!out[i]) ex[i] = (mm==longestStart[k][i]+longestEnd[k][i]+1); mm = -1; //printf("mm = %d\n", mm); for (i=0;i<n;i++) if (!out[i] && ex[i]) { out[i] = 1; v = go(k-1, n); if (mm==-1 || mm>v) mm = v; out[i] = 0; } return mm==-1 ? 0 : mm; } int main() { int n, m, k, i; scanf("%d%d%d", &n, &m, &k); for (i=0;i<n;i++) { f[i] = -1; out[i] = 0; } for (i=0;i<m;i++) { int x, y; scanf("%d%d", &x, &y); x--; y--; e[ie].f = x; e[ie].t = y; e[ie].n = f[x]; f[x] = ie; ie++; } for (i=0;i<n;i++) d[i] = -1; for (i=0;i<n;i++) go_dfs(i); for (i=0;i<n;i++) revd[d[i]] = i; printf("%d\n", go(k, n)); 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 | #include <stdio.h> #include <stdlib.h> #define MAXK 5 #define MAXN 310 #define MAXM 410 typedef struct { int f, t; int n; } t_edge; int ie = 0; t_edge e[MAXM]; int f[MAXN]; int ir = 0; int d[MAXN]; int revd[MAXN]; int out[MAXN]; int longestStart[MAXK][MAXN]; int longestEnd[MAXK][MAXN]; int xmax(int a, int b) { return (a>b) ? a : b; } int xmin(int a, int b) { return (a<b) ? a : b; } void go_dfs(int n) { if (d[n]!=-1) return ; int ix = f[n]; while (ix!=-1) { go_dfs(e[ix].t); ix = e[ix].n; } d[n] = ir++; } void go_start(int k, int n) { if (out[n]) return ; int ix = f[n]; while (ix!=-1) { if (!out[e[ix].t]) longestStart[k][n] = xmax(longestStart[k][n], 1+longestStart[k][e[ix].t]); ix = e[ix].n; } } void go_end(int k, int n) { if (out[n]) return ; int ix = f[n]; while (ix!=-1) { if (!out[e[ix].t]) longestEnd[k][e[ix].t] = xmax(longestEnd[k][e[ix].t], 1+longestEnd[k][n]); ix = e[ix].n; } } int go(int k, int n) { int i, mm, v; int ex[MAXN]; for (i=0;i<n;i++) longestStart[k][i] = longestEnd[k][i] = 0; for (i=0;i<n;i++) go_start(k, revd[i]); for (i=n-1;i>=0;i--) go_end(k, revd[i]); mm = 0; for (i=0;i<n;i++) if (!out[i]) mm = xmax(mm, longestStart[k][i]+longestEnd[k][i]+1); if (k==0) { //printf("V=%d\n", mm); return mm; } for (i=0;i<n;i++) if (!out[i]) ex[i] = (mm==longestStart[k][i]+longestEnd[k][i]+1); mm = -1; //printf("mm = %d\n", mm); for (i=0;i<n;i++) if (!out[i] && ex[i]) { out[i] = 1; v = go(k-1, n); if (mm==-1 || mm>v) mm = v; out[i] = 0; } return mm==-1 ? 0 : mm; } int main() { int n, m, k, i; scanf("%d%d%d", &n, &m, &k); for (i=0;i<n;i++) { f[i] = -1; out[i] = 0; } for (i=0;i<m;i++) { int x, y; scanf("%d%d", &x, &y); x--; y--; e[ie].f = x; e[ie].t = y; e[ie].n = f[x]; f[x] = ie; ie++; } for (i=0;i<n;i++) d[i] = -1; for (i=0;i<n;i++) go_dfs(i); for (i=0;i<n;i++) revd[d[i]] = i; printf("%d\n", go(k, n)); return 0; } |