累尿了。调不出来。

可能:

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;
}