您的位置:首页 > 其它

Dinic邻接矩阵版本

2015-08-07 11:26 127 查看
#include<iostream>

#include<cstdio>

#include<string.h>

#include<string>

#include<stack>

#include<set>

#include<algorithm>

#include<cmath>

#include<vector>

#include<map>

#include<sstream>

#include<queue>

#define ll __int64

#define lll unsigned long long

#define MAX 1000009

#define MAXN 2009

#define eps 1e-8

#define INF 0x7fffffff

#define mod 1000000007

#define clr(a) memset(a,0,sizeof(a))

#define clr1(a) memset(a,-1,sizeof(a))

#define lson l , m , rt << 1

#define rson m + 1 , r , rt << 1 | 1

using namespace std;

inline ll Max(ll a,ll b)

{

return a>b?a:b;

}

inline ll Min(ll a,ll b)

{

return a<b?a:b;

}

//M为边数 N为点数 点标从1-n

const int N = 1000;

const int M = 100000;

int cap

;

int flow

;

int dis
,cur
;//距离起点的距离 cur[i]表示i点正在考虑的边 优化不再考虑已经用过的点 初始化为head

bool vis
;

bool BFS(int Start,int End)

{

memset(vis,0,sizeof(vis));

memset(dis,-1,sizeof(dis));

queue<int>Q;

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

Q.push(Start);

dis[Start]=0;

vis[Start]=1;

while(!Q.empty())

{

int u = Q.front();

Q.pop();

for(int v = 1; v<=N; v++)

{

if(!vis[v] && cap[u][v]>flow[u][v])

{

vis[v]=1;

dis[v]=dis[u]+1;

if(v==End)return true;

Q.push(v);

}

}

}

return false;

}

int DFS(int x, int a,int End) //流入x 的流量是a

{

if(x==End || a==0)return a;

int Flow = 0, f;

for(int v = 1; v<=N; v++)

{

if(dis[x]+1 == dis[v] && (f = DFS(v , Min(a,cap[x][v]-flow[x][v]), End))>0 )

{

flow[x][v] += f;

flow[v][x] -= f;//反向边要减掉

Flow += f;

a -= f;

if(a==0)break;

}

}

return Flow;

}

int Dinic(int Start,int End)

{

int Flow=0;

while(BFS(Start,End))

{

//cout<<Start<<" "<<End<<endl;

Flow += DFS(Start, INF , End);

}

return Flow;

}

int main()

{

#ifdef ONLINE_JUDGE

#else

freopen("an.txt","r", stdin);

#endif

int m,n;

int u,v,w;

while(~scanf("%d%d",&n,&m))

{

clr(cap);

clr(flow);

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

{

scanf("%d%d%d",&u,&v,&w);

cap[u][v]+=w;

}

cout<<Dinic(1,m)<<endl;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: