dinic网络流前向星写法

8 篇文章 0 订阅
2 篇文章 0 订阅

终于照着模板打了一遍前向星……

虽然还不是太懂……

直接上代码吧……依然是poj1273的题


#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#define  M 400
int INF=10000001;
using namespace std;

struct node
{
	int u,v,cap,next;
};
node edge[M*M];
int next[M],head[M],d[M],vis[M];
int ecnt;
void init()
{
	ecnt=0;
	memset(head,-1,sizeof(head));
}

void add(int u,int v,int c)
{
	edge[ecnt].u=v;
	edge[ecnt].v = v;    
    edge[ecnt].cap = c;    
    edge[ecnt].next = head[u];    
    head[u] = ecnt++;    
    
    edge[ecnt].u = v;    
    edge[ecnt].v = u;    
    edge[ecnt].cap = 0;    
    edge[ecnt].next = head[v];    
    head[v] = ecnt++;    
}
bool bfs(int begin,int end)
{
	int i,l,h,k,y;
	for(i=0;i<=end;i++)d[i]=-1;
    d[begin]=0;
    queue<int> q;
    q.push(begin);
    while(!q.empty())
    {
    	k=q.front();
    	q.pop();
    	for(i=head[k];i!=-1;i=edge[i].next)
    	{
    		y=edge[i].v;
    		if(edge[i].cap>0 && d[y]==-1)
    		{
    			d[y]=d[k]+1;
    			if(y==end)return true;
    			q.push(y);
			}
		}
	}
	return false;
}

int dfs(int x,int exp,int end)
{
	vis[x]=1;
	if(x==end)return exp;
	int y,temp,i;
	for(i=next[x];i!=-1;i=edge[i].next,next[x]=i)
	{ y=edge[i].v;
	  if(edge[i].cap>0 && d[y]==d[x]+1 && vis[y]==0)
		if(temp=(dfs(y,min(exp,edge[i].cap),end))>0)
		{
			edge[i].cap-=temp;
			edge[i^1].cap+=temp;
			return temp;
		}
	}
	return 0;
}

int dinic(int begin,int end)
{
int i,ans=0,flow;
while(bfs(begin,end))
{
	for(i=0;i<=end;i++)next[i]=head[i];
	while(true)
	{
		for(i=0;i<=end;i++)vis[i]=0;
		flow=dfs(begin,INF,end);
		if(flow==0)break;
		ans+=flow;
	}
	}
	return ans;	
}


int main()
{   int i,n,m;
	while(~scanf("%d%d",&m,&n))
	{   init();
		for(i=1;i<=m;i++)
		{   int u,v,c;
			scanf("%d%d%d",&u,&v,&c);
			add(u,v,c);
		}
		int sum=dinic(1,n);
		printf("%d\n",sum);
	}
	return 0;
 } 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值