rt,既然是TLE on 2那么有可能是细节写锅了,但是咱过于菜了找不出来
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5,M=4e5+5;
const int inf=0x3f3f3f3f;
int n,m,tot=1,head[N],to[M],nxt[M],c[M],w[M],dis[N],cnt;
bool vis[N];
int cost;
int s,t;
queue<int>q;
void add(int u,int v,int wi,int ci) {
to[++tot]=v,nxt[tot]=head[u],head[u]=tot,w[tot]=wi,c[tot]=ci;
to[++tot]=u,nxt[tot]=head[v],head[v]=tot,w[tot]=0,c[tot]=-ci;
}
bool spfa(){
memset(dis,0x3f,sizeof(dis));
q.push(s),dis[s]=0,vis[s]=1;
while(!q.empty()){
int u=q.front();
q.pop(),vis[u]=0;
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(w[i]&&dis[v]>dis[u]+c[i]){
dis[v]=dis[u]+c[i];
if(!vis[v])q.push(v),vis[v]=1;
}
}
}
return dis[t]!=inf;
}
int dfs(int u,int flow){
if(u==t)return flow;
vis[u]=1;
int rest=0;
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(!vis[v]&&w[i]&&dis[v]==dis[u]+c[i]){
int x=dfs(v,min(flow-rest,w[i]));
if(x)cost+=x*c[i],w[i]-=x,w[i^1]+=x,rest+=x;
}
}
vis[u]=0;
return rest;
}
int ti[100][100];
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>ti[i][j];
}
}
s=0;
t=m*n+n+1;
for(int i=1;i<=n;i++){
add(s,i,1,0);
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
add(i*n+j,t,1,0);
for(int k=1;k<=n;k++){
add(k,n*i+j,1,j*ti[k][i]);
}
}
}
int ans=0;
while(spfa()){
int x;
while(x=dfs(s,inf))ans+=x;
}
printf("%.2lf", (double)cost / n);
}