您的位置:首页 > 其它

[费用流对偶LP 单纯形] HihoCoder #1464 Challenge 26 Rikka with Flow

2017-02-15 12:28 423 查看
直接上dls的solution



关于我的单纯形TLE的问题 在这里讨论过了

关于对偶的问题 在这里放出来过

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=505;
const int M=505;
const double eps=1e-8;

int n,m; int nxt
;
double a[M]
;

inline void PIVOT(int l,int e){
int last=-1;
for (int i=0;i<=n;i++) if (i!=e) a[l][i]/=a[l][e];
a[l][e]=1/a[l][e];
memset(nxt,-1,sizeof(nxt));
for (int i=0;i<=n;i++) if (i!=e && (a[l][i]>eps||a[l][i]<-eps)) nxt[i]=last,last=i;
for (int i=0;i<=m;i++){
if (i==l || (a[i][e]<eps && a[i][e]>-eps)) continue;
for (int j=last;~j;j=nxt[j])
a[i][j]-=a[i][e]*a[l][j];
a[i][e]=-a[i][e]*a[l][e];
}
}

inline double Simplex(){
while (1){
int l=0,e=0; double mn=1e15; double mx=eps;
for (int i=1;i<=n;i++) if (a[0][i]>mx) { mx=a[0][i]; e=i; }
if (!e) return -a[0][0];
for (int i=1;i<=m;i++)
if (a[i][e]>eps && a[i][0]/a[i][e]<mn)
mn=a[i][0]/a[i][e],l=i;
PIVOT(l,e);
}
}

int main(){
int _n,_m,_c,_u,_v,_w,_f;
double Ans=0;
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
scanf("%d%d%d",&_n,&_m,&_c);
n=_n+2*_m; m=2*_m+1;
for (int i=1;i<=_m;i++){
scanf("%d%d%d%d",&_u,&_v,&_f,&_w); Ans+=_w;
a[i][_v]=1; a[i][_u]=-1; a[i][_n+i]=1; a[i][_n+_m+i]=-1;
a[_m+i][_n+i]=1; a[_m+i][0]=_w;
a[2*_m+1][_n+_m+i]=_f;
a[0][_n+i]=1;
}
a[2*_m+1][0]=_c;
Ans-=Simplex();
printf("%.10lf\n",Ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: