20pts 求调
查看原帖
20pts 求调
515129
TLEWA楼主2025/2/2 10:08

rt

#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N=85,K=200005;
const long double eps=1e-6,INF=1e12;

int t;
int n,m,p,y;
long double f[N][N][N],dp[N][N][N],val[N][N],c[N],ans;

struct Node {int v;long double w;int id;};
vector<Node> vec[K];

int S,T;
int dep[K],cur[K];

queue<int> que;
bool bfs() {
	memset(dep,0,sizeof(dep));
	que.push(S);
	dep[S]=1;
	
	int u;
	while(!que.empty()) {
		u=que.front();
		que.pop();
		int v;long double w;
		for(int i=0;i<vec[u].size();++i) {
			v=vec[u][i].v,w=vec[u][i].w;
			if(!dep[v] && w>eps) {
				dep[v]=dep[u]+1;
				que.push(v);
			}
		}
	}
	memset(cur,0,sizeof(cur));
	return dep[T];
}

long double dfs(int u,long double flow) {
	if(u==T) return flow;
	
	int v;long double w,d,cnt=0;
	for(int i=cur[u];i<vec[u].size();++i) {
		cur[u]=i;
		v=vec[u][i].v,w=vec[u][i].w;
		if(dep[v]==dep[u]+1 && w>eps) {
			d=dfs(v,min(w,flow-cnt));
			vec[v][vec[u][i].id].w+=d;
			vec[u][i].w-=d;
			cnt+=d;
			if(cnt+eps>=flow) return cnt; 
		}
	}
	return cnt;
}

void add(int u,int v,long double w) {
	vec[u].push_back({v,w,vec[v].size()});
	vec[v].push_back({u,0,vec[u].size()-1});
}

#define id(i,j) ((i)*(m+1)-m-1+(j))

void solve() {
	cin >> n >> m >> p >> y;
	for(int i=1;i<=p;++i) cin >> c[i];
	for(int i=1;i<=p;++i) c[i]+=c[i-1];
	for(int j=1;j<=m;++j)
		for(int i=1;i<=n;++i)
			for(int k=1;k<=p;++k)
				cin >> f[i][j][k];
	
	for(int i=1;i<=n;++i) {
		for(int j=1;j<=m;++j) {
			dp[i][j][0]=1,val[i][j]=0;
			for(int k=1;k<=p;++k) dp[i][j][k]=dp[i][j][k-1]*f[i][j][k];
			for(int k=1;k<=p;++k) {
				dp[i][j][k]=dp[i][j][k]*(1-f[i][j][k+1]);
				val[i][j]+=dp[i][j][k]*c[k];
			}
		}
	}
	
	for(int i=1;i<=n*m+2;++i) vec[i].clear();
	S=n*(m+1)+1,T=n*(m+1)+2;
	for(int i=1;i<=n;++i) {
		add(S,id(i,1),INF);
		add(id(i,m+1),T,INF);
		for(int j=1;j<=m;++j) {
			add(id(i,j),id(i,j+1),val[i][j]);
		}
	}
	
	int a,b,k;
	for(int i=1;i<=y;++i) {
		cin >> a >> b >> k;
		for(int j=max(1ll,1ll-k);j<=m+1;++j) add(id(b,j),id(a,min(j+k,m+1)),INF);
	}
	
	long double flow=0;
	while(bfs()) {
		flow+=dfs(S,INF);
		if(flow>=INF) {
			cout << -1 << '\n';
			return;
		}
	}
	cout << fixed << setprecision(8) << flow << '\n';
}

signed main() {
	cin >> t;
	while(t--) solve();
	return 0;
}
2025/2/2 10:08
加载中...