MnZn求助网络流
查看原帖
MnZn求助网络流
420129
Nt_Tsumiki楼主2024/2/28 14:40

WA on #32

比答案少一

挺形象的,看了半天也没看出来哪里挂了

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <ctime>

#define N 5001
#define M 5000001
#define INF 0x3f3f3f3f

using namespace std;
int n,pcnt,a[N],p[N][4],mp1[100010],mp2[7];

int tot=1,S,T,s,t,mcmf,head[N<<3],cur[N<<3],vis[N<<3],dis[N<<3];
struct Node { int to,nxt,dis,val; }e[M<<1];

void add(int u,int v,int w,int k) { e[++tot]=Node{v,head[u],w,k},head[u]=tot; }

bool SPFA() {
	memcpy(cur,head,sizeof head);
	memset(dis,0x3f,sizeof dis);
	memset(vis,0,sizeof vis);
	queue<int> q; q.push(S); dis[S]=0;
	while (!q.empty()) {
		int u=q.front(); q.pop();
		vis[u]=0;
		for (int i=head[u];i;i=e[i].nxt) {
			int v=e[i].to;
			if (e[i].dis and dis[v]>dis[u]+e[i].val) {
				dis[v]=dis[u]+e[i].val;
				if (!vis[v]) q.push(v),vis[v]=1;
			}
		}
	}
	return dis[T]!=INF;
}

int dfs(int u,int flow) {
	if (u==T) return flow;
	int res=0; vis[u]=1;
	for (int i=cur[u];i and flow;i=e[i].nxt) {
		int v=e[i].to; cur[u]=i;
		if (e[i].dis and dis[v]==dis[u]+e[i].val and !vis[v]) {
			int k=dfs(v,min(flow,e[i].dis));
			e[i].dis-=k,e[i^1].dis+=k,res+=k,flow-=k,mcmf+=k*e[i].val;
		}
	}
	vis[u]=0; return res;
}

int main() {
	scanf("%d",&n);
	for (int i=1;i<=n;i++) scanf("%d",a+i);
	S=++pcnt,s=++pcnt; add(S,s,2,0),add(s,S,0,0);
	for (int i=1;i<=n;i++) p[i][0]=++pcnt,p[i][1]=++pcnt,p[i][2]=++pcnt,p[i][3]=++pcnt;
	t=++pcnt,T=++pcnt; add(t,T,2,0),add(T,t,0,0);
	for (int i=1;i<=n;i++) {
		add(s,p[i][0],1,0),add(p[i][0],s,0,0);
		add(p[i][0],p[i][1],1,-1),add(p[i][1],p[i][0],0,1);
		add(p[i][2],p[i][0],INF,0),add(p[i][0],p[i][2],0,0);
		add(p[i][3],p[i][0],INF,0),add(p[i][0],p[i][3],0,0);
		add(p[i][1],t,1,0),add(t,p[i][1],0,0);
		if (mp1[a[i]]) add(p[mp1[a[i]]][2],p[i][2],INF,0),add(p[i][2],p[mp1[a[i]]][2],0,0);
		if (mp2[a[i]%7]) {
			add(p[mp2[a[i]%7]][1],p[i][3],INF,0),add(p[i][3],p[mp2[a[i]%7]][1],0,0);
			add(p[mp2[a[i]%7]][3],p[i][3],INF,0),add(p[i][3],p[mp2[a[i]%7]][3],0,0);
		}
		if (mp1[a[i]-1]) add(p[mp1[a[i]-1]][1],p[i][2],INF,0),add(p[i][2],p[mp1[a[i]-1]][1],0,0);
		if (mp1[a[i]+1]) add(p[mp1[a[i]+1]][1],p[i][2],INF,0),add(p[i][2],p[mp1[a[i]+1]][1],0,0);
		mp1[a[i]]=i,mp2[a[i]%7]=i;
	}
	int ans=0;
	while (SPFA()) ans+=dfs(S,INF);
	// printf("%d\n",ans);
	printf("%d\n",-mcmf);
	return 0;
}
2024/2/28 14:40
加载中...