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 3204 最大流

题目大意是这样,找这样一种边的个数,就是增加该边的容量,可以使得最大流变大 那么首先我们求一遍最大流,如果某条边符合我们的要求,那么这条边必然是满流的,否则增加容量也没有用,然后假设端点为u->v,...

poj 3204 Ikki's Story I - Road Reconstruction(最大流,增广路)

题目链接 Ikki's Story I - Road Reconstruction Time Limit: 2000MS   Memory Limit: 131072K Total S...

POJ 3204 最大流

题意:问加哪些边容量增大能够增加整体流量。 很显然,增加单个边容量改变全局容量,一遍最大流之后,这些边只有可能出现在满流的边内,而且是一条路中唯一的一条满流边。 题解: 大众解法,一遍最大流之后,...

POJ 3204 最小割边

Ikki's Story I - Road Reconstruction Time Limit: 2000MS   Memory Limit: 131072K Total Submissi...

poj 3204(最大流处理)

Ikki's Story I -  Road Reconstruction Time Limit: 2000MS   Memory Limit: 131072K ...

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

Ikki's Story I - Road Reconstruction Time Limit: 2000MS   Memory Limit: 131072K Tota...

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

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

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

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

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

这题还是有点技巧的。 我们求出了最大流,怎样知道哪些边可以使得流量增大呢? 若存在e(U,V):S->U路径上的点都有剩余容量,V->T路径上的点都有剩余容量。 如果有某条边为上述情况,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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