社区讨论
求助 全部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 条回复,欢迎继续交流。
正在加载回复...