然后我发现我的dinic也有点问题....
原来在for循环外边将当前弧重置为j,但是这样是不好的,因为有可能当前弧并没有流满,只是因为从之前节点流过来的流的数量限制导致不能继续流了,如果在循环外边重置当前弧,可能导致某条边并没有流满,就被放到当前弧的后边而不再考虑了...
所以这是更新后的dfs...
int dfs(int i,int v) {
if (i==t) {
a[t].v+=v;
return v;
}
int ans=0;
for (int &j=a[i].cur;j!=-1;j=b[j].ne) {
if (b[j].f>0&&a[b[j].t].h>a[i].h) {
int tmp=dfs(b[j].t,min(b[j].f,v));
v-=tmp;
b[j].f-=tmp;
b[j^1].f+=tmp;
ans+=tmp;
if (v==0) return ans;
}
}
a[i].v+=ans;
return ans;
}
这是整个更新后的模板...更新后跑SPOJ的FASTFLOW只需要1.14秒了....
struct NetWorkFlow {
struct Node {
int fe,h,cur,v;
};
struct Edge {
int t,ne,f;
};
Node a[N];
Edge b[M*2];
int d[M];
int s,t,n,p;
void clear(int nn,int ss,int tt) {
n=nn;s=ss;t=tt;
for (int i=0;i<=n;i++) {
a[i].fe=-1;
a[i].v=0;
}
p=0;
}
void putedge(int x,int y,int f) {
b[p].t=y;
b[p].f=f;
b[p].ne=a[x].fe;
a[x].fe=p;
p++;
b[p].t=x;
b[p].f=0;
b[p].ne=a[y].fe;
a[y].fe=p;
p++;
}
bool bfs() {
int i,p,q,j;
for (i=0;i<=n;i++) a[i].h=0;
a[s].h=1;
p=q=0;
d[q++]=s;
while (p<q) {
i=d[p];
for (j=a[i].fe;j!=-1;j=b[j].ne) {
if (a[b[j].t].h==0&&b[j].f>0) {
a[b[j].t].h=a[i].h+1;
if (b[j].t==t) return true;
d[q++]=b[j].t;
}
}
p++;
}
return false;
}
int dfs(int i,int v) {
if (i==t) {
a[t].v+=v;
return v;
}
int ans=0;
for (int &j=a[i].cur;j!=-1;j=b[j].ne) {
if (b[j].f>0&&a[b[j].t].h>a[i].h) {
int tmp=dfs(b[j].t,min(b[j].f,v));
v-=tmp;
b[j].f-=tmp;
b[j^1].f+=tmp;
ans+=tmp;
if (v==0) return ans;
}
}
a[i].v+=ans;
return ans;
}
int flow() {
int i;
a[s].v=MAXINT;
while (bfs()) {
for (i=0;i<=n;i++) a[i].cur=a[i].fe;
dfs(s,MAXINT);
}
return a[t].v;
}
};