费用流非极限数据一个点TLE 90pts求助
查看原帖
费用流非极限数据一个点TLE 90pts求助
352426
就决定是你辣楼主2023/2/2 11:17

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);
}
2023/2/2 11:17
加载中...