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 2100
using 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;
}