WA求调
查看原帖
WA求调
819004
lostinue楼主2024/9/8 16:47

dinic没问题,帮忙看建图谢

#include<bits/stdc++.h>
#define ll long long
#define rep(i,aaa,bbb) for(int i=(aaa);i<=(bbb);i++)
#define per(i,aaa,bbb) for(int i=(aaa);i>=(bbb);i--)
#define all(a) (a).begin(),(a).end()
#define edl cout<<endl
#define pb push_back
#define eb emplace_back
#define pii pair<int,int>
#define l first
#define r second
#define ptln(...) print(__VA_ARGS__,"\n")
using namespace std;

template<typename T>inline void read(T&x){cin>>x;}
template<typename T,typename...Args>inline void read(T&x,Args&...args){read(x);read(args...);}
template<typename T>inline void print(const T&x){cout<<x;}
template<typename T,typename...Args>inline void print(const T&x,Args&&...args){cout<<x<<" ";print(args...);}

constexpr int inf=0x7f7f7f7f;
constexpr int maxn=4e3+10;

struct edge{
	int v,f,c,b;
	edge(int vv,int ff,int cc,int bb):v(vv),f(ff),c(cc),b(bb){};
};

int n,m,K;
int df[210][210],dt[210][210];
int id[210][3010];
int tot;
vector<edge>G[maxn];

struct Dinic{
	int S=1,T;
	int V[maxn];
	int dis[maxn];
	int cur[maxn];
	int minCost;
	
	bool spfa(){
		memset(dis,0x7f,sizeof dis);
		memset(cur,0,sizeof cur);
		queue<int>Q;
		Q.push(S),dis[S]=0,V[S]=1;
		while(!Q.empty()){
			int x=Q.front();Q.pop(),V[x]=0;
//			ptln("Q",x);
			for(edge j:G[x]){
				if(j.f&&dis[j.v]>dis[x]+j.c){
					dis[j.v]=dis[x]+j.c;
					if(!V[j.v])Q.push(j.v),V[j.v]=1;
				}
			}
		}
//		ptln("SPFA",dis[T]);
		return dis[T]!=inf;
	}
	
	int dfs(int x,int flow){
		if(x==T)return flow;
		V[x]=1;
		int ans=0;
		for(int&i=cur[x];i<(int)G[x].size()&&flow>ans;++i){
			int v=G[x][i].v,f=G[x][i].f,c=G[x][i].c,b=G[x][i].b;
			if(!V[v]&&f&&dis[v]==dis[x]+c){
				int res=dfs(v,min(f,flow-ans));
				if(res){
//					ptln("Cost",res,c);
					minCost+=res*c;
					G[x][i].f-=res;
					G[v][b].f+=res;
					ans+=res;
				}
			}
		}
		V[x]=0;
//		ptln("maxFlow",x,ans);
		return ans;
	}
	
	int mcmf(){
		int ans=0;
		while(spfa()){
			while(int x=dfs(S,K))ans+=x;
		}
		return ans;
	}
}dinic;

void add(int a,int s,int b,int t,int f,int c){//(a,s)--f,c-->(b,t)
	if(s<0||t>dinic.T)return;
	int x=id[a][s]?id[a][s]:(id[a][s]=++tot);
	int y=id[b][t]?id[b][t]:(id[b][t]=++tot);
	G[x].eb(y,f,c, (int)G[y].size() ),G[y].eb(x,0,-c, (int)G[x].size()-1 );
}

int main(){//ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
	read(n,m,K,dinic.T);
	rep(i,0,n-1)rep(j,0,n-1)read(dt[i][j]);
	rep(i,0,n-1)rep(j,0,n-1)read(df[i][j]);
	rep(i,0,dinic.T-1)add(0,i,0,i+1,K,0);
	rep(i,1,m){
		int a,b,s,t,c;read(a,b,s,t,c);
		add(0,s-dt[0][a],a,s,1,df[0][a]);
		add(a,s,b,t,1,-c);
		add(b,t,0,t+dt[b][0],K,df[b][0]);
//		ptln(0,s-dt[0][a],a,s,1,df[0][a]);
//		ptln(a,s,b,t,1,-c);
//		ptln(b,t,0,t+dt[b][0],K,df[b][0]);
	}
	rep(i,1,n-1){
		int now=-1;
		rep(j,0,dinic.T){
			if(!id[i][j])continue;
			if(now==-1){
				now=j;
				continue;
			}
			add(i,now,i,j,K,0);
			now=j;
		}
	}
	dinic.T+=1;
	dinic.mcmf();
	print(-dinic.minCost);
	return 0;
}

/*
2 1 1 10
0 5
5 0
0 5
5 0
0 1 0 5 10
*/

2024/9/8 16:47
加载中...