HDU 3549 最大流 EK算法 邻接表实现

来源:互联网 发布:2017昆广网络收费标准 编辑:程序博客网 时间:2024/06/05 11:14

EK就是BFS不断地找增广路,知道找不到为止,复杂度O(VE^2)

 把边开小了 结果还回TLE 查了半天没查出来,边开成2倍就过了

 

#include<stdio.h>#include<stdlib.h>#include<math.h>#include<iostream>#include<string.h>#include<algorithm>#include<queue>#include<vector>#include<map>#include<set>#define inf 0x7fffffff#define eps 1e-8#define maxn 100#define maxe 2100using namespace std;struct node{    int v,next,cap;}edge[maxe];int n,m;int size,head[maxn];int pe[maxn],pre[maxn];//pe记录当前点是由那条边转移过来的 ,pre记录前驱void init(){    memset(head,-1,sizeof(head));    size=0;}void addedge(int u,int v,int cap){    edge[size].v=v;    edge[size].next=head[u];    edge[size].cap=cap;    head[u]=size++;    edge[size].v=u;    edge[size].cap=0;    edge[size].next=head[v];    head[v]=size++;}int EK(int s,int t){    int maxflow=0;    queue<int> q;    while(1)  //不停的找增广路 并进行增广 直到找不到增广路为止    {        while(!q.empty()) //BFS        q.pop();        memset(pre,-1,sizeof(pre));        q.push(s);        while(!q.empty())        {            int u=q.front();            q.pop();            for(int i=head[u];i!=-1;i=edge[i].next)            {                int v=edge[i].v;                if(pre[v]==-1&&edge[i].cap>0)                {                    q.push(v);                    pre[v]=u;                    pe[v]=i;                }            }            if(pre[t]!=-1) //到达汇点 找到一条增广路 跳出BFS            break;        }        if(pre[t]==-1) //没有找到增广路 跳出大循环        break;        int aug=inf;        for(int v=t;v!=s;v=pre[v]) //找到最小的容量 aug        aug=min(aug,edge[pe[v]].cap);        for(int v=t;v!=s;v=pre[v])        {            edge[pe[v]].cap-=aug; //更新正向边            edge[pe[v]^1].cap+=aug;//更新反向边        }        maxflow+=aug;    }    return maxflow;}int main(){    freopen("in.txt","r",stdin);    int t;    scanf("%d",&t);    int ii=1;    while(t--)    {        scanf("%d%d",&n,&m);        int i,u,v,c;        init();        for(i=0;i<m;i++)        {            scanf("%d%d%d",&u,&v,&c);            addedge(u,v,c);        }        printf("Case %d: %d\n",ii++,EK(1,n));    }    return 0;}


 


 

原创粉丝点击