得到一个教训:不要妄想在网络流里面在线修改什么东西;在一开始建模的时候,就应该吧所有的可能考虑进去。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 60
#define MAXM 9
#define MAXPT (MAXM*MAXN+MAXN)
#define MAXEG (MAXPT+MAXN*MAXN*MAXM)
#define INF 200000000
struct node{
int v,w,c;
node *next,*back;
}edge[2*MAXEG+10],*adj[MAXPT+10],*ecnt=&edge[0],*fa[MAXPT+10];
int n,m,s,t,dist[MAXPT+10];
bool vis[MAXPT+10];
void addedge(int u,int v,int c,int w)
{
node *p=++ecnt;
p->v=v;
p->w=w,p->c=c;
p->next=adj[u],p->back=ecnt+1;
adj[u]=p;
p=++ecnt;
p->v=u;
p->w=0,p->c=0;
p->next=adj[v],p->back=ecnt-1;
adj[v]=p;
}
void read()
{
int x;
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&x);
for(int k=1;k<=n;k++)
addedge(i,j*n+k,1,x*k);
}
s=0,t=n+m*n+1;
for(int i=1;i<=n;i++)
addedge(s,i,1,0);
for(int i=n+1;i<=m*n+n;i++)
addedge(i,t,1,0);
}
bool SPFA()
{
int u,v;
memset(vis,0,sizeof vis);
for(int i=s;i<=t;i++)
dist[i]=INF;
queue<int> que;
que.push(s);
dist[s]=0,vis[s]=true;
while(!que.empty()){
u=que.front(); que.pop();
vis[u]=false;
for(node *p=adj[u];p;p=p->next){
v=p->v;
if(p->c>0&&dist[v]>dist[u]+p->w){
dist[v]=dist[u]+p->w;
fa[v]=p;
if(!vis[v]){
que.push(v);
vis[v]=true;
}
}
}
}
if(dist[t]==INF) return false;
else return true;
}
void mincost_maxflow()
{
int cost=0;
while(SPFA()){
int delta=INF;
node *p;
for(int u=t;u!=s;u=p->back->v){
p=fa[u];
delta=min(delta,p->c);
}
for(int u=t;u!=s;u=p->back->v){
p=fa[u];
p->c-=delta;
p->back->c+=delta;
p->back->w=-p->w;
cost+=delta*p->w;
}
}
printf("%.02lf\n",cost/(1.0*n));
}
int main()
{
//freopen("1.in","r",stdin);
read();
mincost_maxflow();
}