Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
拆点+枚举+网络流(预流推进)还超时啊。。。?谁能帮帮。。#include<iostream> #include<cstdio> #include<deque> using namespace std; const int mxn = 400; const int mxf = 0x7fffffff; int n,np,nc,m; int c[mxn][mxn],f[mxn][mxn]; deque<int> act; int h[mxn]; int ef[mxn]; int s,t; int i,j,k,flow,tp; int push_relabel() { int i,sum=0,u,v,p; for(i=0;i<n+n;i++) h[i] = 0; h[s] = n+n; memset(ef,0,sizeof(ef)); ef[s] = mxf; ef[t] = -mxf; act.push_front(s); while(!act.empty()){ u = act.back(); act.pop_back(); for(i=0;i<n+n;i++){ v = i; if(c[u][v]<ef[u]) p = c[u][v]; else p = ef[u]; if(p>0 && (u==s || h[u]==h[v]+1)){ c[u][v] -= p; c[v][u] += p; if(v==t) sum += p; ef[u] -= p; ef[v] += p; if(v!=s && v!=t) act.push_front(v); } } if(u!=s && u!=t && ef[u]>0){ h[u]++; act.push_front(u); } } return sum; } int main() { memset(f,0,sizeof(f)); scanf("%d%d%d",&n,&s,&t); s--;t--; for(i=0;i<n;++i) for(j=0;j<n;++j) scanf("%d",&f[i][j]); for(i=0;i<n;++i) if(i!=s&&i!=t){ for(j=0;j<n;++j) if(f[i][j]){ f[n+i][j]=2147483647; f[i][j]=0; } f[i][n+i]=1; } for(i=0;i<n+n;++i) for(j=0;j<n+n;++j) c[i][j]=f[i][j]; flow=push_relabel(); if(f[s][t]){ printf("NO ANSWER!\n"); return 0; } if(flow==0){ printf("0\n"); return 0; } printf("%d\n",flow); for(i=0;i<n;++i) if(i!=s&&i!=t&&flow){ f[i][n+i]=0; for(j=0;j<n+n;++j) for(k=0;k<n+n;++k) c[j][k]=f[j][k]; tp=push_relabel(); if(flow>tp){ flow=tp; printf("%d ",i+1); } else{ f[i][n+i]=1; } } printf("\n"); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator