poj3281 DINIC

2024-04-28 17:38
文章标签 poj3281 dinic

本文主要是介绍poj3281 DINIC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

 

如题:http://poj.org/problem?id=3281

 

    初学最大流.

    这题重要的是图的构建。源点-》食物-》牛-》牛-》饮料-》汇点。0是源点,1-f食物,f+1-f+1+n食物到牛,f+1+n-f+1+2*n牛到牛,f+1+2*n-f+1+2*n+d牛到饮料,f+1+2*n+d+1最终汇点。

 

    按照上面建图,用DINIC算法求最大流即可.

 

   

#include<iostream>
using namespace std;
#include<queue>
#define min(a,b)(a<b?a:b)
#define INF INT_MAX
#define N 410

int map[N][N];
int n,sink,maxflow,source,f,d;
int dis[N];
int bfs()
{
 queue<int>QUE;
 int k;
 int i;
 memset(dis,-1,sizeof(dis));
 //dis[sink]=0;
 //QUE.push(sink);
  dis[source]=0;
  QUE.push(source);
 while(!QUE.empty())
 {
  k=QUE.front();
  QUE.pop();
  for(i=0;i<n;i++)
  {
  // if(dis[i]==-1&&map[i][k])
   if(dis[i]==-1&&map[k][i])
   {
    dis[i]=dis[k]+1;
    QUE.push(i);
   }
  }
 //if(k==source) return 1;
  if(k==sink) return 1;
 }
 return 0;
}

int dfs(int cur,int cp)
{
 if(cur==sink) return cp;
 int tmp=cp,t;
 for(int i=0;i<n&&tmp;i++)
 {
 // if(dis[i]+1==dis[cur]&&map[cur][i])
  if(dis[i]==dis[cur]+1&&map[cur][i])
  {
   t=dfs(i,min(map[cur][i],tmp));
   map[cur][i]-=t;
   map[i][cur]+=t;
   tmp-=t;
  }
 }
 return cp-tmp;
}
void dinic()
{
 maxflow=0;
 while(bfs())
  maxflow+=dfs(source,INF);
}
int main()
{
 int i,j;
 int sum_f,sum_d,tmp;
 freopen("C:\\1.txt","r",stdin);
 while(~scanf("%d%d%d",&n,&f,&d))
 {
  memset(map,0,sizeof(map));
  source=0,sink=2*n+f+1+d;
  for(i=1;i<=f;i++)
   map[source][i]=1;
  for(i=1;i<=d;i++)
   map[f+2*n+i][sink]=1;
  for(i=1;i<=n;i++)
   map[f+i][f+i+n]=1;
  for(i=1;i<=n;i++)
  {
   scanf("%d%d",&sum_f,&sum_d);
   for(j=1;j<=sum_f;j++)
   {
    scanf("%d",&tmp);
    map[tmp][f+i]=1;
   }
   for(j=1;j<=sum_d;j++)
   {
    scanf("%d",&tmp);
    map[f+n+i][f+2*n+tmp]=1;
   }
  }
  n=sink+1;
  dinic();
  printf("%d\n",maxflow);
 }
}

 

 

 

这篇关于poj3281 DINIC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943849

相关文章

POJ训练计划1459_Power Network(网络流最大流/Dinic)

解题报告 这题建模实在是好建,,,好贱,,, 给前向星给跪了,纯dinic的前向星竟然TLE,sad,,,回头看看优化,,, 矩阵跑过了,2A,sad,,, /*************************************************************************> File Name: PowerN.cpp> Author: _nplus>

关于Dinic算法的几点讨论

基本概念 Dinic算法是经典的网络最大流算法,该算法由在EK算法的基础上增加"分层"这一概念得到。算法复杂度为,求解二分图最大匹配的时间复杂度为 算法过程 分层操作: 进行一次BFS。在BFS的过程中不断对未访问过的结点进行分层。在分层的过程中,使用一个队列保存需要进行分层的点集,并用一个d[N]数组保存每个结点所在的层数。 算法主体(Dinic): 在算法的主体过程中,我们只从层数

网络最大流增广路模板(EK Dinic)

EK算法: int fir[maxn];int u[maxm],v[maxm],cap[maxm],flow[maxm],nex[maxm];int e_max;int p[maxn],q[maxn],d[maxn];void add_edge(int _u,int _v,int _w){int e;e=e_max++;u[e]=_u;v[e]=_v;cap[e]=_w;nex[e]

最大流的Dinic算法

基于Ford-Fulkerson方法的原始的DFS算法效率是比较低的,因此针对如何尽快的扩流存在一系列的改进算法,例如Dinic算法。Dinic算法的基本思路是:在一次搜索中,在层次间进行扩流,而不是仅对一条路径进行扩流。所谓层次,就是指各节点距离起点的路径长度。当然,每个节点的层次随着残量的变化而变化。     Dinic算法的基本流程是: 1、根据残量网络计算层次图,使用BFS; 2、

网络流模板 Dinic+ISAP

dinic递归版,堆栈溢出可以手动扩栈,改成非递归版本,或者改用效率更高的ISAP。 struct Edge{int from, to, cap, flow;Edge(){}Edge(int from, int to, int cap, int flow) : from(from), to(to), cap(cap), flow(flow){}};int n, m, s, t;ve

POJ 3308 Paratroopers(最小割+Dinic)

题目链接:http://poj.org/problem?id=3308 题意:外星人来攻打地球了。。。外星人派了一些伞兵来攻占地球的兵工场,兵工厂是一个矩形网格,伞兵会降落在兵工厂的某个位置。地球人有激光武器,可以杀死一行或者一列的所有敌人。但是每个激光武器安置在每行每列的费用都是不同的。伞兵很厉害只要一个就可以消灭兵工厂,所以,现在要部署一套激光系统使得伞兵一降落就可以消灭所有敌人。并且要求费

POJ 1459 Power Network(Dinic邻接表+当前弧优化)

题目链接:http://poj.org/problem?id=1459 题意:一个电网包含一些结点(电站、消费者、调度站),这些结点通过电线连接。每个结点u 可能被供给s(u)的电能,s(u)≥0;同时也可能产生p(u)的电能,0≤p(u)≤pmax(u);站点u 还有可能消费c(u)电能,0≤c(u)≤min( s(u), cmax(u) );可能传输d(u)的电能,d(u) = s(u) +

POJ 2987 Firing (最大权闭合子图Dinic)

题意:公司打算裁员,裁掉某些员工可以获得正收益,而裁掉某些员工会遭受损失。并且员工之间往往存在一定的关系,当某个员工被裁掉之后,在他的关系之下的所有员工都必须被裁掉。现在要求如何裁员才能获得最大收益。 题解:s->正权, 负权->t。  ans = 正权和 - maxflow, 或者 ans = 正权和 - 没有被裁的正权和 - abs(被裁的负权和) ( 正边权进入最小割表示该人没被炒,非正边权

POJ 1149 PIGS (最大流Dinic)

题意:话说一个猪圈管理员,他本身没有猪圈的钥匙。每天会有许多顾客来买猪,这些顾客自己带着某些猪圈的钥匙。每当一个顾客来买猪,这些打开的猪圈里的猪可以随意流动,买完猪之后打开的猪圈全部关闭。现在已知每个猪圈里猪的的数量,每一名顾客拥有的钥匙以及他想购买的猪的数量。求管理员可以卖出的最大数量。 题解:构图是难点在于猪的流动。我是这样想的,假设顾客A可以打开了猪圈1,3,5,他需要购买numA头猪,由

POJ 3281(dinic)

题目链接:http://poj.org/problem?id=3281   题目大意:n头牛,f种食物,d种饮料,然后给出每头牛想吃的食物和饮料,问如果每只牛选一个自己喜欢的食物和饮料,而且每个食物和饮料只能被选一次,问最多能让多少头牛满意   题目思路:这道题有两个限制条件:1、每种食物和饮料只能被选一次。2、每头牛只能选一个喜欢的食物和一个喜欢的饮料。考虑网络流建边。我们把整张图分成三