竹子听

3月31日 EK模板 在奋战了一个中午之后终于........

#include<cstdio>

#include<cstring>

#include<queue>

using namespace std;

#define maxn 2000

#define maxx 9999999

#define min(x,y) x<y?x:y  //**这里是不用return的  

int n,m,capacities[maxn][maxn],pre[maxn];

queue<int> Q;

void clear()

{

memset(capacities,0,sizeof(int));

memset(pre,0,sizeof(int));

}

int bfs(int src,int des)

{

int flag=0;

int increasement=maxx;

while(!Q.empty())  Q.pop();

for(int i=1;i<=n;i++) pre[i]=-1;

pre[src]=0; 

Q.push(src);

while(!Q.empty())

{

int now=Q.front();//注意啊这里是front而不是pop

Q.pop();

if(now==des) break;//这里漏写了一句导致死循环QAQ

for(int i=1;i<=n;i++)

if(capacities[now][i]>0&&i!=now&&pre[i]==-1)

{

increasement=min(increasement,capacities[now][i]);

pre[i]=now;

Q.push(i);

}

if(pre[des]==-1) return 0;

return increasement;

}

int maxflow(int src,int des)

{

int total=0;

int increasement=0;

//对于下面的代码:我刚才居然用的是if语句:“标程用的是循环,其实src和des没有改变的情况下好像是一样的吧 ”

    //吃枣药丸,不用循环你怎么使用反向流啊傻 

    //虽然说src和des没有改变,但是capacities改变会使bfs的结果改变的 

while(increasement=bfs(src,des)!=0)

{

int last=des,k;

while(last!=src&&last!=0)

{

k=pre[last];//**就是这里写错了,这里记得注意前后顺序啊 

capacities[k][last]-=increasement;

capacities[last][k]+=increasement;

last=k;

}

total+=increasement;//这里不确定是不是这样加的 ,但标程是这么写的,这么暴力啊 

}

return total;

}

int main()

{

int temp1,temp2,x;

scanf("%d%d",&n,&m);

clear();

for(int i=1;i<=m;i++)

{

scanf("%d%d%d",&temp1,&temp2,&x);

if(temp1==temp2) continue; //这里要提前判断起点和终点是否相同 

capacities[temp1][temp2]+=x;//有可能重复 

}

printf("%d \n",maxflow(1,n));

}


评论