#include #include #include #include #define inf 0x3f3f3f3f #define MAXN 3000 #define MAXM 30000 using namespace std; struct node { int u,v,f,c; }; node e[MAXM]; int first[MAXN],ne[MAXM],cc; int inq[MAXN],pre[MAXN],preedge[MAXN],d[MAXN]; inline void add_edge(int u,int v,int f,int c) { e[cc].u=u; e[cc].v=v; e[cc].f=f; e[cc].c=c; ne[cc]=first[u]; first[u]=cc; cc++; e[cc].v=u; e[cc].u=v; e[cc].f=0; e[cc].c=-c; ne[cc]=first[v]; first[v]=cc; cc++; } int SPFA(int s,int t) { memset(inq,0,sizeof(inq)); int i; for(i=0;i<=t;i++) d[i]=-inf; memset(pre,-1,sizeof(pre)); memset(preedge,-1,sizeof(preedge)); d[s]=0; queue q; q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); inq[u]=0; int i; for(i=first[u];i!=-1;i=ne[i]) { int v=e[i].v; if(e[i].f) { if(d[v]