社区讨论
麻了
灌水区参与者 6已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @lo3jqajc
- 此快照首次捕获于
- 2023/10/24 07:46 2 年前
- 此快照最后确认于
- 2023/10/29 10:56 2 年前
是标题党,HLPP模板题深夜求调
CPP#include<bits/stdc++.h>
#define debug puts("ok")
using namespace std;
const int N=1210,M=120010,inf=0x3f3f3f3f;
struct edge{
int ed,next;
int w;
}a[M*2];
int nbs[N],h[N],gap[N*2],d[N];
int n,m,g,s,t;
bool v[N];
struct cmp{
bool operator()(int x,int y)const{
return h[x]<h[y];
}
};
priority_queue<int,vector<int>,cmp>p;
void add(int x,int y,int z){
g++;
a[g].ed=y;
a[g].next=nbs[x];
a[g].w=z;
nbs[x]=g;
return;
}
void read(){
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1,x,y,z;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,0);
}
return;
}
bool bfs(){
memset(h,inf,sizeof(h));
queue<int>q;
h[t]=0;q.push(t);
while(!q.empty()){
int k=q.front();q.pop();
for(int x=nbs[k];x;x=a[x].next){
int u=a[x].ed;
if(a[x^1].w&&h[u]>h[k]+1){
h[u]=h[k]+1;
q.push(u);
}
}
}
return h[s]!=inf;
}
void flow(int k){
for(int x=nbs[k];x;x=a[x].next){
int u=a[x].ed,l=a[x].w;
if(!l||h[u]+1!=h[k])
continue;
int f=min(l,d[k]);
d[k]-=f;d[u]+=f;
a[x].w-=f;a[x^1].w+=f;
if(u!=s&&u!=t&&!v[u]){
p.push(u);
v[u]=1;
}
if(!d[k])break;
}
return;
}
void relabel(int k){
h[k]=inf;
for(int x=nbs[k];x;x=a[x].next){
int u=a[x].ed;
if(a[x].w)
h[k]=min(h[k],h[u]+1);
}
return;
}
int hlpp(){
if(!bfs())return 0;
h[s]=n;
for(int i=1;i<=n;i++)
if(h[i]!=inf)gap[h[i]]++;
for(int x=nbs[s];x;x=a[x].next){
int u=a[x].ed,l=a[x].w;
if(!l)continue;
d[s]-=l;d[u]+=l;
a[x].w-=l;a[x^1].w+=l;
if(u!=s&&u!=t&&!v[u]){
if(h[u]!=inf)
p.push(u);
v[u]=1;
}
}
while(!p.empty()){
for(int i=1;i<=n;i++)
cout<<h[i]<<" "<<d[i]<<"|";
puts("");
int k=p.top();p.pop();
v[k]=0;flow(k);
if(!d[k])continue;
gap[h[k]]--;
if(!gap[h[k]]){
for(int i=1;i<=n;i++)
if(i!=s&&i!=t&&h[i]>h[k])
h[i]=max(h[i],n+1);
}
relabel(k);
gap[h[k]]++;
p.push(k);v[k]=1;
}
return d[t];
}
signed main(){
read();
int AC=hlpp();
printf("%d",AC);
return 0;
}
这个蒟蒻已经快被抽干了,RERE何时了……
回复
共 7 条回复,欢迎继续交流。
正在加载回复...