#include <stdio.h> #include <iostream> #include <vector> #include <ctime> #include <cstdlib> using namespace std; const int C=501; int ln[5][C], ded[C], sw[C], ij[C], lol[5]; vector <vector <int> > tab(C); int F[C], d[C], par[C], asw[C]; int findlen(int n, vector <vector <int> > &gr, int ij[], int sw[], int dead[], int l[], int p){ int i, j, iF=0, jF=0, mx=0, a; for (i=1;i<=n;i++) { asw[i]=sw[i]; if (asw[i]==0&&dead[i]==0) F[jF]=i, d[i]=1, par[i]=-1, jF++; } if (jF==0) return 0; for (iF=0;iF<jF;iF++){ a=F[iF]; if (d[a]>d[mx]) mx=a; for (j=0;j<ij[a];j++){ asw[gr[a][j]]--; if (d[gr[a][j]]<d[a]+1) d[gr[a][j]]=d[a]+1, par[gr[a][j]]=a; if (asw[gr[a][j]]==0&&dead[gr[a][j]]==0) F[jF]=gr[a][j], jF++; } } j=0; for (i=a;i>=0;i=par[i]) l[j]=i, j++; lol[p]=j; mx=d[mx]; for (i=1;i<=n;i++) par[i]=0, d[i]=0; return mx; } void kill(int a){ int i; ded[a]++; if (ded[a]>1) return; for (i=0;i<ij[a];i++) sw[tab[a][i]]--; } void lift(int a){ int i; ded[a]--; if (ded[a]>0) return; for (i=0;i<ij[a];i++) sw[tab[a][i]]++; } int main(){ srand(time(NULL)); int n, m, k, i, j, a, b, i1, i2, i3, i4, zz, amx=1000; scanf ("%d %d %d", &n, &m, &k); for (i=0;i<m;i++) scanf ("%d %d", &a, &b), tab[a].push_back(b), ij[a]++, sw[b]++; if (k>=n){ printf ("%d\n", 0); return 0; } if (k==0) amx=findlen(n, tab, ij, sw, ded, ln[0], 0); if (k==1){ findlen(n, tab, ij, sw, ded, ln[0], 0); for (i1=0;i1<lol[0];i1++){ kill(ln[0][i1]); zz=findlen(n, tab, ij, sw, ded, ln[1], 1); if (zz<amx) amx=zz; lift(ln[0][i1]); } } if (k==2){ findlen(n, tab, ij, sw, ded, ln[0], 0); for (i1=0;i1<lol[0];i1++){ kill(ln[0][i1]); findlen(n, tab, ij, sw, ded, ln[1], 1); for (i2=0;i2<lol[1];i2++){ kill(ln[1][i2]); zz=findlen(n, tab, ij, sw, ded, ln[2], 2); if (zz<amx) amx=zz; lift(ln[1][i2]); } lift(ln[0][i1]); } } if (k==3){ findlen(n, tab, ij, sw, ded, ln[0], 0); for (i1=0;i1<lol[0];i1++){ kill(ln[0][i1]); findlen(n, tab, ij, sw, ded, ln[1], 1); for (i2=0;i2<lol[1];i2++){ kill(ln[1][i2]); findlen(n, tab, ij, sw, ded, ln[2], 2); for (i3=0;i3<lol[2];i3++){ kill(ln[2][i3]); zz=findlen(n, tab, ij, sw, ded, ln[3], 3); if (zz<amx) amx=zz; lift(ln[2][i3]); } lift(ln[1][i2]); } lift(ln[0][i1]); } } if (k==4){ findlen(n, tab, ij, sw, ded, ln[0], 0); for (i1=0;i1<lol[0];i1++){ kill(ln[0][i1]); findlen(n, tab, ij, sw, ded, ln[1], 1); for (i2=0;i2<lol[1];i2++){ kill(ln[1][i2]); findlen(n, tab, ij, sw, ded, ln[2], 2); for (i3=0;i3<lol[2];i3++){ kill(ln[2][i3]); findlen(n, tab, ij, sw, ded, ln[3], 3); for (i4=0;i4<lol[3];i4++){ kill(ln[3][i4]); zz=findlen(n, tab, ij, sw, ded, ln[4], 4); if (zz<amx) amx=zz; lift(ln[3][i4]); } lift(ln[2][i3]); } lift(ln[1][i2]); } lift(ln[0][i1]); } } printf ("%d\n", amx); 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 126 127 128 129 130 131 132 133 134 135 136 137 138 | #include <stdio.h> #include <iostream> #include <vector> #include <ctime> #include <cstdlib> using namespace std; const int C=501; int ln[5][C], ded[C], sw[C], ij[C], lol[5]; vector <vector <int> > tab(C); int F[C], d[C], par[C], asw[C]; int findlen(int n, vector <vector <int> > &gr, int ij[], int sw[], int dead[], int l[], int p){ int i, j, iF=0, jF=0, mx=0, a; for (i=1;i<=n;i++) { asw[i]=sw[i]; if (asw[i]==0&&dead[i]==0) F[jF]=i, d[i]=1, par[i]=-1, jF++; } if (jF==0) return 0; for (iF=0;iF<jF;iF++){ a=F[iF]; if (d[a]>d[mx]) mx=a; for (j=0;j<ij[a];j++){ asw[gr[a][j]]--; if (d[gr[a][j]]<d[a]+1) d[gr[a][j]]=d[a]+1, par[gr[a][j]]=a; if (asw[gr[a][j]]==0&&dead[gr[a][j]]==0) F[jF]=gr[a][j], jF++; } } j=0; for (i=a;i>=0;i=par[i]) l[j]=i, j++; lol[p]=j; mx=d[mx]; for (i=1;i<=n;i++) par[i]=0, d[i]=0; return mx; } void kill(int a){ int i; ded[a]++; if (ded[a]>1) return; for (i=0;i<ij[a];i++) sw[tab[a][i]]--; } void lift(int a){ int i; ded[a]--; if (ded[a]>0) return; for (i=0;i<ij[a];i++) sw[tab[a][i]]++; } int main(){ srand(time(NULL)); int n, m, k, i, j, a, b, i1, i2, i3, i4, zz, amx=1000; scanf ("%d %d %d", &n, &m, &k); for (i=0;i<m;i++) scanf ("%d %d", &a, &b), tab[a].push_back(b), ij[a]++, sw[b]++; if (k>=n){ printf ("%d\n", 0); return 0; } if (k==0) amx=findlen(n, tab, ij, sw, ded, ln[0], 0); if (k==1){ findlen(n, tab, ij, sw, ded, ln[0], 0); for (i1=0;i1<lol[0];i1++){ kill(ln[0][i1]); zz=findlen(n, tab, ij, sw, ded, ln[1], 1); if (zz<amx) amx=zz; lift(ln[0][i1]); } } if (k==2){ findlen(n, tab, ij, sw, ded, ln[0], 0); for (i1=0;i1<lol[0];i1++){ kill(ln[0][i1]); findlen(n, tab, ij, sw, ded, ln[1], 1); for (i2=0;i2<lol[1];i2++){ kill(ln[1][i2]); zz=findlen(n, tab, ij, sw, ded, ln[2], 2); if (zz<amx) amx=zz; lift(ln[1][i2]); } lift(ln[0][i1]); } } if (k==3){ findlen(n, tab, ij, sw, ded, ln[0], 0); for (i1=0;i1<lol[0];i1++){ kill(ln[0][i1]); findlen(n, tab, ij, sw, ded, ln[1], 1); for (i2=0;i2<lol[1];i2++){ kill(ln[1][i2]); findlen(n, tab, ij, sw, ded, ln[2], 2); for (i3=0;i3<lol[2];i3++){ kill(ln[2][i3]); zz=findlen(n, tab, ij, sw, ded, ln[3], 3); if (zz<amx) amx=zz; lift(ln[2][i3]); } lift(ln[1][i2]); } lift(ln[0][i1]); } } if (k==4){ findlen(n, tab, ij, sw, ded, ln[0], 0); for (i1=0;i1<lol[0];i1++){ kill(ln[0][i1]); findlen(n, tab, ij, sw, ded, ln[1], 1); for (i2=0;i2<lol[1];i2++){ kill(ln[1][i2]); findlen(n, tab, ij, sw, ded, ln[2], 2); for (i3=0;i3<lol[2];i3++){ kill(ln[2][i3]); findlen(n, tab, ij, sw, ded, ln[3], 3); for (i4=0;i4<lol[3];i4++){ kill(ln[3][i4]); zz=findlen(n, tab, ij, sw, ded, ln[4], 4); if (zz<amx) amx=zz; lift(ln[3][i4]); } lift(ln[2][i3]); } lift(ln[1][i2]); } lift(ln[0][i1]); } } printf ("%d\n", amx); return 0;} |