社区讨论
DINIC会TLE??
P2740[USACO4.2] 草地排水 Drainage Ditches参与者 4已保存回复 22
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 22 条
- 当前快照
- 1 份
- 快照标识符
- @mi8656sr
- 此快照首次捕获于
- 2025/11/21 09:15 4 个月前
- 此快照最后确认于
- 2025/11/21 09:59 4 个月前
这道板子体最后一个点一直TLE
加了弧优化也不行
求dalao帮忙看看吧qaq
CPP加了弧优化也不行
求dalao帮忙看看吧qaq
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define maxn 1000010
#define inf 0x7fffffff
using namespace std;
inline int read(){
int x=0,t=1; char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch<='9'&&ch>='0') x=x*10+ch-48,ch=getchar();
return x*t;
}
int n,m;
struct EDGE{
int next,to,val;
int depth;
}edge[maxn<<1];
int head[maxn],cnt;
int u,v,w;
int cur[maxn];
inline void add(int u,int v,int w){
edge[++cnt].to=v;
edge[cnt].val=w;
edge[cnt].next=head[u];
head[u]=cnt;
}
inline bool bfs(){
queue<int> q;
while(!q.empty()) q.pop();
for(register int i=1;i<=n;++i) edge[i].depth=0;
edge[1].depth=1;
q.push(1);
while(!q.empty()){
int u=q.front(); q.pop();
for(register int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].to;
if(edge[i].val>0&&edge[v].depth==0){
edge[v].depth=edge[u].depth+1;
q.push(v);
}
}
}
if(edge[m].depth>0) return 1;
return 0;
}
inline int dinic(int u,int dis){
if(u==m) return dis;
for(register int &i=cur[u];i+1;i=edge[i].next){
int v=edge[i].to;
if(edge[i].val>0&&edge[v].depth==edge[u].depth+1){
int minn=dinic(v,min(dis,edge[i].val));
if(minn>0){
edge[i].val-=minn;
edge[i^1].val+=minn;
return minn;
}
}
}
return 0;
}
int main(){
cnt=-1;
memset(head,-1,sizeof(head));
n=read(); m=read();
for(register int i=1;i<=n;++i){
u=read(); v=read(); w=read();
add(u,v,w); add(v,u,0);
}
int ans=0;
while(bfs()){
for(register int i=1;i<=m;++i) cur[i]=head[i];
while(int sum=dinic(1,inf)) ans+=sum;
}
printf("%d\n",ans);
return 0;
}
回复
共 22 条回复,欢迎继续交流。
正在加载回复...