HDU3549(最大流算法的Dinic算法)

题目:Flow Problem

#include 
#include 
#include 

using namespace std;

const int N=2050;     //N表示点的数量
const int M=2500000;  //M表示边的数量,注意应大于(N-1)*N,因为网络是双向的
const int INF=0x7fffffff;

int e;
int ver[M],next[M],flow[M];  //ver为边指向的节点,flow为边的容量,next为链表的下一条边
int head[N],work[N],dis[N],q[N]; //head为节点的链表头,work 用于算法中的临时链表头,dis 计算距离

void init()
{
    e=0;
    memset(head,-1,sizeof(head));
}

void add(int u,int v,int c)  //增加一条从u到v容量为c的边
{
    ver[e]=v;flow[e]=c;next[e]=head[u];head[u]=e++;
    ver[e]=u;flow[e]=0;next[e]=head[v];head[v]=e++;
}


//广搜计算出每个点与源点的最短距离,如果不能到达汇点说明算法结束
int bfs(int S,int T)
{
    int rear=0;
    memset(dis,-1,sizeof(dis));
    dis[S]=0;q[rear++]=S;
    for(int i=0;i

你可能感兴趣的:(图论)