Starlight_Glimmer @ 2019-07-14 21:52:07
RT 写的EK算法 邻接矩阵会MLE 就把板改成了邻接表版本的 蒟蒻一时脑残 忘记了反向边这种事情 然后结果还A了
//EK 邻接表vector版本 能过luogu3376
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
#define MAXN 10005
#define LL long long
#define INF 0x3f3f3f3f
int n,m,s,t,flow;
struct node{
int v,w;
};
vector<node>cap[MAXN];//残留网络
int aug[MAXN];//s-i路径上的残留容量
node p[MAXN];//前驱
int bfs()
{
int u,v;
queue<int>Q;
memset(aug,0,sizeof(aug));
aug[s]=INF;
Q.push(s);
while(!Q.empty())
{
u=Q.front();
Q.pop();
for(int i=0;i<cap[u].size();i++)
{
int v=cap[u][i].v,w=cap[u][i].w;
if(aug[v]==0&&w)
{
aug[v]=min(aug[u],w);
p[v].v=u,p[v].w=i;
if(v==t) return aug[t];
Q.push(v);
}
}
/*for(int v=1;v<=n;v++)
{
if(aug[v]==0&&cap[u][v])
{
aug[v]=min(aug[u],cap[u][v]);
p[v]=u;
if(v==t) return aug[t];
Q.push(v);
}
}*/
}
return 0;
}
void EK()
{
int u,v,delta;
while(1)
{
delta=bfs();
if(delta==0) break;//找不到增广路 结束算法
for(v=t;v!=s;v=u)//修改增广路上的残留容量
{
u=p[v].v;
int i=p[v].w;
cap[u][i].w-=aug[t];
//这里...不知道怎么改反向的那个 但是能过luogu板题qwq
/*cap[u][v]-=aug[t];//更新残留网络
cap[v][u]+=aug[t];*/
}
flow+=delta;
}
}
int main()
{
scanf("%d %d %d %d",&n,&m,&s,&t);
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
node tmp;
tmp.v=v,tmp.w=w;
cap[u].push_back(tmp);
//cap[u][v]+=w;
//cap[v][u]+=w;//无向边
}
EK();
printf("%d\n",flow);
return 0;
}
by DocMander @ 2019-07-19 10:40:28
tql %%%
by bfxbfx @ 2019-07-28 00:13:45
对对对 ,我也发现这个问题,所以特意翻开讨论区,果然也有人发现了,我是反向边操作犯了个大错,改了后AC,但是之前有错的时候发现样例没错,就把加反向边删了试着交了一下,然而还是全AC了,数据太过于水了