#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define FOR(i, a, b) for(int i=(a); i<=(b); i++) #define FORD(i, a, b) for(int i=(a); i>=(b); i--) #define REP(i, n) for(int i=0; i<(n); i++) #define ALL(x) (x).begin(), (x).end() #define MP make_pair #define PB push_back #define F first #define S second #define FI first #define SE second #define FORE(i, c) for(__typeof((c).begin()) i = (c).begin(); i!=(c).end(); ++i) #define SIZE(x) ((int)(x).size()) typedef vector VI; typedef long long ll; typedef pair PII; #define MAX_N 2500 #define INFTY 100000000 struct kraw { int v1,v2,w,c; int n,wh; }; int n,m,ost; vector t[MAX_N]; int d[MAX_N]; kraw par[MAX_N]; char ss[MAX_N]; int kk; #define M 2500 vector v[M]; void add_edge(int v1,int v2,int w,int c) { w=(v1ost) { dorel=false; REP(i,n) if(rel[i]) { REP(j,SIZE(t[i])) if(t[i][j].c && d[t[i][j].v2]>d[i]+t[i][j].w) { rel[t[i][j].v2]=true; dorel=true; d[t[i][j].v2]=d[i]+t[i][j].w; par[t[i][j].v2]=t[i][j]; } rel[i]=false; } } } int transform(int pocz,int kon) { kraw e1; int v=kon,mi=INFTY; while(v!=pocz) { mi=min(mi,par[v].c); v=par[v].v1; } v=kon; while(v!=pocz) { kraw &e=par[v]; t[e.v1][e.wh].c-=mi; if(e.n!=-1) t[e.v2][e.n].c+=mi; else { e1.v1=e.v2; e1.v2=e.v1; e1.w=-e.w; e1.c=mi; e1.wh=SIZE(t[e1.v1]); e1.n=e.wh; e.n=e1.wh; t[e1.v1].PB(e1); } v=e.v1; } return mi; } int Busacker_Gowen(int pocz,int kon) { bool poss=true; int wyn=0; ost=-1000000000; while(poss) { Bellman_Ford(pocz,kon); if(par[kon].v1==-1) poss=false; else { wyn+=transform(pocz,kon)*d[kon]; ost=d[kon]; } } return wyn; } #define inf 1000000 int num[M][M],od[M][M]; char s[13]; list q; int A,B,C,D; int wynik(int n) { REP(pocz,n) { REP(i,n) od[pocz][i]=inf; od[pocz][pocz]=0; q.clear(); q.push_back(pocz); while(!q.empty()) { int x=q.front(); q.pop_front(); FORE(a,v[x]) if(od[pocz][a->F]>od[pocz][x]+(a->S)) { od[pocz][a->F]=od[pocz][x]+(a->S); if(a->S) q.push_back(a->F); else q.push_front(a->F); } } } // REP(i,n) { REP(j,n) printf("%d ",od[i][j]); printf("\n");} int ret=inf; REP(i,n) { reth && j) { add_edge(k,num[i-h-1][j-1],0,inf); add_edge(num[i-h-1][j-1],k,0,inf); } if(i>h && j