累尿了。调不出来。
可能:
1.建图有问题
2.模板有问题(雅埋蝶啊)
3.精度有问题
参考:http://www.cnblogs.com/jianglangcaijin/archive/2012/10/06/2713375.html
浪费时间太长了,A不了,先放一放,周日再搞
未AC代码。
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #define min(x,y) ((x)<(y)?(x):(y)) using namespace std; struct Node { int u,v,flow,next; double cost; }; const int INF=1000000000; Node edges[40005]; int e,S,T; int head[1005],in[1005],pre[1005],flow[1005]; double cost[1005]; void add(int u,int v,int flow,double cost) { edges[e].u=u; edges[e].v=v; edges[e].flow=flow; edges[e].cost=cost; edges[e].next=head[u]; head[u]=e++; } void Add(int u,int v,int flow,double cost) { add(u,v,flow,cost); add(v,u,0,-cost); } int OK(int s,int t) { int i,u,v,f; double c; queue<int> Q; memset(pre,-1,sizeof(pre)); memset(in,0,sizeof(in)); memset(flow,0,sizeof(flow)); for(i=0;i<=t;i++) cost[i]=-1.0*INF; cost[s]=0;flow[s]=INF;Q.push(s);in[s]=1; while(!Q.empty()) { u=Q.front(); Q.pop(); in[u]=0; for(i=head[u];i!=-1;i=edges[i].next) { v=edges[i].v; f=edges[i].flow; c=edges[i].cost; if(f>0&&cost[v]<cost[u]+c) { cost[v]=cost[u]+c; flow[v]=min(flow[u],f); pre[v]=i; if(!in[v]) Q.push(v),in[v]=1; } } } return flow[t]; } int MCMF(int s,int t) { int minflow,mincost=0,i; while(minflow=OK(s,t)) { for(i=pre[t];i!=-1;i=pre[edges[i].u]) { mincost+=minflow*edges[i].cost; edges[i].flow-=minflow; edges[i^1].flow+=minflow; } } return mincost; } int a[45][25],n,m,K,s[25],p[25]; double cal(int x,int w) { return (4.0-3.0*(100-x)*(100-x)/1600)*w; } int main() { while(scanf("%d%d%d",&n,&K,&m),n||m||K) { int i,j; for(i=1;i<=m;i++) scanf("%d",&p[i]); for(i=1;i<=m;i++) scanf("%d",&s[i]); for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&a[i][j]); S=0; T=n+m+1; memset(head,-1,sizeof(head)); e=0; for(i=1;i<=n;i++) Add(i+m,T,K,0); for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(a[i][j]) Add(j,i+m,K,0); double pre,cur; for(i=1;i<=m;i++) { if(s[i]<60) { Add(S,i,60-s[i],1.0*INF); pre=cal(60,p[i]); for(j=61;j<=100;j++) { cur=cal(j,p[i]); Add(S,i,1,cur-pre); pre=cur; } } else { pre=cal(s[i],p[i]); for(j=s[i]+1;j<=100;j++) { cur=cal(j,p[i]); Add(S,i,1,cur-pre); pre=cur; } } } MCMF(S,T); for(i=head[S];i!=-1;i=edges[i].next) s[edges[i].v]+=edges[i^1].flow; for(i=1;i<=m;i++) printf("%d ",s[i]); int sum=0; for(i=1;i<=m;i++) sum+=p[i]; double ans=0; for(i=1;i<=m;i++) { if(s[i]<60) break; ans+=cal(s[i],p[i])/sum; } if(i<=m) ans=0; printf("%.6lf\n",ans); } return 0; }