POJ-3204 最大流+枚举

原创 2012年03月26日 15:06:53

     题意是说给个有向图..起点与终点..问哪些边在容量增加后,从起点到终点的最大流会增加...

     首先跑出最大流..然后枚举剩余容量为0的边..若从图的起点到这条边的起点能走通..这条边得重点到图的终点能走通..则说明这条边增加容量..从起点到终点的最大流会增加..应该好理解吧~~感觉就是每次在做增广路时,只有一条边的剩余容量为当前增广路的最大流量...但由于做增广路时还可能在后面通过剩余网络来调整..可能会导致前面已经确定的边发生变化...因此这个过程就放在了做完了整个图起点到终点的最大流之后~


Program:

#include<iostream>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<queue>
#define oo 2000000000
using namespace std;
struct node
{
      int x,y,c,next;
}line[50005];
int n,m,_link[605],ans,dis[605],way[605],num;
bool used[605];
queue<int> myqueue;
bool BFS()
{
      int i,h,k;
      while (!myqueue.empty()) myqueue.pop();
      memset(used,false,sizeof(used));
      memset(dis,0,sizeof(dis));
      myqueue.push(0);  used[0]=true;
      while (!myqueue.empty())
      {
            h=myqueue.front();
            myqueue.pop();
            k=_link[h]; 
            while (k)
            {
                  if (line[k].c && !used[line[k].y])
                  {
                          dis[line[k].y]=dis[h]+1;
                          used[line[k].y]=true;
                          myqueue.push(line[k].y); 
                  }
                  k=line[k].next;
            }
      }
      return used[n];
}
bool DFS(int p,int Flow)
{
      int k;
      if (p==n)
      {
            for (k=1;k<=num;k++)
            {
                   line[way[k]].c-=Flow;
                   m++;
                   line[m].x=line[way[k]].y;
                   line[m].y=line[way[k]].x;
                   line[m].c=Flow;
            }
            return true; 
      }
      num++;
      k=_link[p];
      while (k)
      {
            if (line[k].c && dis[line[k].y]-dis[line[k].x]==1)
            {
                   way[num]=k;
                   if (DFS(line[k].y,min(Flow,line[k].c))) return true;
            }
            k=line[k].next;
      }
      num--;
      return false;
}
void MaxFlow()
{ 
      if (!n) return;
      while (BFS()) 
      {
             num=0; 
             DFS(0,oo); 
      } 
      return;
}
bool ok(int s,int e)
{
      int h,k;
      while (!myqueue.empty()) myqueue.pop();
      memset(used,false,sizeof(used));
      myqueue.push(s);  used[s]=true;
      while (!myqueue.empty())
      {
             h=myqueue.front();
             myqueue.pop();
             k=_link[h];
             while (k)
             {
                   if (line[k].c && !used[line[k].y])
                   {
                         used[line[k].y]=true;
                         myqueue.push(line[k].y);
                   }
                   k=line[k].next;
             }
      }
      return used[e];
}
int main()
{
      int i;
      scanf("%d%d",&n,&m);
      memset(_link,0,sizeof(_link));
      for (i=1;i<=m;i++)
      {
            scanf("%d%d%d",&line[i].x,&line[i].y,&line[i].c);
            line[i].next=_link[line[i].x];
            _link[line[i].x]=i;
      }
      n--;
      MaxFlow();
      ans=0;
      for (i=1;i<=m;i++)
        if (!line[i].c && ok(0,line[i].x) && ok(line[i].y,n)) ans++; 
      printf("%d\n",ans);
      return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ-8469 特殊密码锁

题目 来源 限制 描述 输入 输出 样例输入 样例输出 解题报告 思路分析 源代码题目来源中国MOOC网,程序设计与算法(二)第一周作业1 http://cxsjsxmooc.openjudge.c...
  • mading0613
  • mading0613
  • 2017年02月05日 16:34
  • 1211

枚举-拨钟问题(算法基础 第2周)

枚举-拨钟问题问题描述: 分析: 原题是POJ上的:http://cxsjsxmooc.openjudge.cn/test/Z/ 这道题跟‘画家问题’和‘熄灯问题’是一类题目,注意减...
  • NNNNNNNNNNNNY
  • NNNNNNNNNNNNY
  • 2016年06月04日 14:57
  • 1456

POJ 3977Subset(枚举+二分)

Subset Time Limit: 30000MS   Memory Limit: 65536K Total Submissions: 1562   Accepted: 261 ...
  • opm777
  • opm777
  • 2014年05月20日 17:43
  • 1210

poj 3204(最大流处理)

Ikki's Story I -  Road Reconstruction Time Limit: 2000MS   Memory Limit: 131072K ...
  • water_glass
  • water_glass
  • 2011年09月19日 19:27
  • 507

POJ 3204 求使得最大流增大的边

这题还是有点技巧的。 我们求出了最大流,怎样知道哪些边可以使得流量增大呢? 若存在e(U,V):S->U路径上的点都有剩余容量,V->T路径上的点都有剩余容量。 如果有某条边为上述情况,...
  • sevenster
  • sevenster
  • 2012年04月20日 15:46
  • 519

Poj 3204 Ikki's Story I - Road Reconstruction【最大流Dinic+可行方案边数统计】

Ikki's Story I - Road Reconstruction Time Limit: 2000MS   Memory Limit: 131072K Tota...
  • mengxiang000000
  • mengxiang000000
  • 2016年08月12日 11:51
  • 585

POJ3204 Ikki's Story I - Road Reconstruction [最大流]

我觉得算是比较简单的最大流了吧。主要是要理解清楚题意。 题意:一个有向图,源点汇点已经确定,有向边已经知道,要求出增加某单条边得权值可以使最大流增加的单条边的个数。 思路:其实使最大流增加这个条件...
  • wuyanyi
  • wuyanyi
  • 2011年09月29日 20:54
  • 629

poj 3204 Ikki's Story I - Road Reconstruction (最大流的应用)

题目:对于一个有向图,提高一条边的容量,可能可以增加该图的最大流。对给定的图,问存在多少条这样的边。 解法:先求最大流,把边填充好,得到残余图。在残余图中,从s出发DFS,把所有能到达的点标记。同样...
  • logic_nut
  • logic_nut
  • 2011年09月26日 09:21
  • 577

POJ 1815 最大流最小割枚举找割点

这题WA得我SB一样.......竟然是声明了一个函数没有调用..... 题意: 在联系网中,去掉最少的联系点使得从S和T无法联系。 赤裸裸的求最小割点集的问题; 建图: 网上都有,就不说了...
  • sevenster
  • sevenster
  • 2012年04月19日 13:22
  • 1033

poj 3498(枚举加最大流dinic)

这个题需要自己建一个超级源点,建边 s -> i -> i ' ; s->i 容量为 i 点企鹅的数量,i到 i ' 容量为能跳多少次,然后枚举到每一个点的最大流,如果等于企鹅的总数,记录这个点。。最...
  • water_glass
  • water_glass
  • 2011年10月01日 12:23
  • 595
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ-3204 最大流+枚举
举报原因:
原因补充:

(最多只允许输入30个字)