社区讨论

求助 全部TLE但是怀疑死循环

P2598[ZJOI2009] 狼和羊的故事参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhjdf342
此快照首次捕获于
2025/11/04 00:45
4 个月前
此快照最后确认于
2025/11/04 00:45
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N=1e6+5;
const int M=1e6+5;
const ll inf=1e18;

int n,m,s,t;

struct Edge{
	int to,nxt;
	ll cap;
}e[M];
int head[N],tot=1;
void add(int u,int v,ll w){
	e[++tot]={v,head[u],w};
	head[u]=tot;
}

int dep[N],cur[N];
bool bfs(){
	memset(dep,0,sizeof(dep));
	queue<int> q;
	q.push(s);
	dep[s]=1;
	while(!q.empty()){
		int u=q.front();q.pop();
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].to;
			if(e[i].cap>0&&!dep[v]){
				dep[v]=dep[u]+1;
				q.push(v);
			}
		}
	}
	return dep[t]>0;
}

ll dfs(int u,ll flow){
	if(u==t)
		return flow;
	ll used=0;
	for(int &i=cur[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(e[i].cap>0&&dep[v]==dep[u]+1){
			ll f=dfs(v,min(flow-used,e[i].cap));
			if(f>0){
				e[i].cap-=f;
				e[i^1].cap+=f;
				used+=f;
				if(used==flow)
					break;
			}
		}
	}
	return used;
}

ll dinic(){
	ll ans=0;
	while(bfs()){
		memcpy(cur,head,sizeof(head));
		ans+=dfs(s,inf);
	}
	return ans;
}

const int dx[4]={1,-1,0,0};
const int dy[4]={0,0,1,-1};

int main(){
	scanf("%d%d",&n,&m);
	s=0,t=n*m+1;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			int opt;
			scanf("%d",&opt);
			if(opt==1)
				add(s,(i-1)*m+j,inf);
			else 
				if(opt==2)
					add((i-1)*m+j,t,inf);
		}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			for(int k=0;k<4;k++){
				int x=i+dx[k],y=j+dy[k];
				if(x<1||x>n||y<1||y>m) 
					continue;
				add((i-1)*m+j,(x-1)*m+y,1);
			}
	printf("%lld\n",dinic());
	return 0;
}
玄关,感谢^w^

回复

1 条回复,欢迎继续交流。

正在加载回复...