POJ-2135 自己构图WA了..参考了别人的构图..

原创 2012年03月24日 20:13:51

     看到这题我想到的是以前USACO做的一道构图求最小割的~~构图构得蛮Happy~~猛然发现是无向图..就各种坑爹纠结了...最后跑出样例~~提交还是WA了...呃~~

     参考了别人的构图...学习学习..

     "基础最小费用最大流。加一个源点S和一个汇点T,源点S与点1连一条容量为2费用为0点边,点n与汇点T也连一条容量为2费用为0的边,对于题目给定的那些边。每条边的容量为1,费用为每条边花费的时间。注意这是双向边。然后求最小费用。"---From http://blog.sina.com.cn/s/blog_71fda4350100w9tr.html

      Discuss里有人说跑两次SPFA..其实本题用最小费用最大流的方法就是跑了两次SPFA...本质上是一样的...

      解网络流几种形式的方法是基本固定的..像这道题..最后重新构图时,除了main函数里的一些关于构图的代码...其他一点没改..一下子就改好了...所以.网络流的根本还是巧妙的构图...

  

Program:

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<queue>
#define oo 2000000000
using namespace std;
struct node1
{
      int x,y,c,w,next;
}line[50005];
struct node2
{
      int w,pre,l;
}dp[3005];
int n,m,_link[3005],ans;
bool inqueue[3005];
queue<int> myqueue;
bool SPFA()
{
      int i,h,k;
      memset(dp,-1,sizeof(dp));
      memset(inqueue,false,sizeof(inqueue));
      while (!myqueue.empty()) myqueue.pop();
      myqueue.push(0);
      dp[0].pre=dp[0].w=0;
      while (!myqueue.empty())
      {
             h=myqueue.front();
             myqueue.pop();
             inqueue[h]=false;
             k=_link[h];
             while (k)
             {
                   if (line[k].c && (dp[line[k].y].w>dp[h].w+line[k].w || dp[line[k].y].pre==-1))
                   {
                          dp[line[k].y].w=dp[h].w+line[k].w;
                          dp[line[k].y].pre=h; dp[line[k].y].l=k;
                          if (!inqueue[line[k].y])
                          {
                                myqueue.push(line[k].y);
                                inqueue[line[k].y]=true;
                          }
                   }
                   k=line[k].next;
             }
      }
      if (dp[n].pre==-1) return false;
      return true;
}
void MinCostOfMaxFlow()
{
      int i;
      ans=0;
      while (SPFA())
      { 
            i=n;
            while (i)
            {
                  line[dp[i].l].c-=1;  
                  ans+=line[dp[i].l].w;
                  m++;
                  line[m].x=line[dp[i].l].y;
                  line[m].y=line[dp[i].l].x;
                  line[m].w=-line[dp[i].l].w;
                  line[m].c=1;  
                  line[m].next=_link[line[m].x];
                  _link[line[m].x]=m;
                  i=dp[i].pre; 
            } 
      }
      return;
}
int main()
{
      int p,x,y,w;
      memset(_link,0,sizeof(_link));
      scanf("%d%d",&n,&p);
      m=0;
      while (p--)
      {
            m++;
            scanf("%d%d%d",&x,&y,&w);
            line[m].c=1; line[m].w=w;
            line[m].x=x; line[m].y=y;
            line[m].next=_link[line[m].x];
            _link[line[m].x]=m;
            m++;
            line[m].c=1;  line[m].w=w;
            line[m].x=y; line[m].y=x;
            line[m].next=_link[line[m].x];
            _link[line[m].x]=m; 
      } 
      n++;
      m++;
      line[m].x=0; line[m].y=1; 
      line[m].c=2; line[m].w=0;
      line[m].next=_link[line[m].x];
      _link[line[m].x]=m; 
      m++;
      line[m].x=n-1; line[m].y=n;
      line[m].c=2; line[m].w=0;
      line[m].next=_link[line[m].x];
      _link[line[m].x]=m; 
      MinCostOfMaxFlow();
      printf("%d\n",ans);
      return 0;
}


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

poj 2135 Farm Tour--最小费用最大流--邻接表--构图的时候注意退边--以及退边的算法

/* 题意:n个地点有m条路相连,从1走到n再回来,不走重复的路(这题居然认为,同一条路,按不同的方向走算是走不重复的路) 最小费用最大流 因为要来回,素以相当于找两条1~n的最短路 s~1 流量...

POJ-1149 参考大牛的构图..

自己开始构图..各种奇葩..各种bug不对...实在不行了...还是看了大牛的构图:        http://imlazy.ycool.com/post.2059102.html       ...
  • kk303
  • kk303
  • 2012年03月27日 21:55
  • 981

POJ 1149 最大流+构图

点击打开链接 题意:有m个猪圈,n个商人,每个商人会买固定猪圈的猪,在每个商人买完猪后,我可以调整开着门的猪圈的住的个数,可以从其他开着门的猪圈调过来,问n个商人最多能买走多少猪 思路:o(︶︿︶...
  • Dan__ge
  • Dan__ge
  • 2016年04月21日 21:21
  • 1353

POJ2455 Secret Milking Machine(二分上线构图求最大流)

一张无向图中有 N 个点,M 条边,每条边都有一个权值,且每条边只能用一次,要求找出 T 条从 1 到 N 的路径,使这 T 条路径所经过的边中,权值的最大值最小。 思想:二分边权值上线,多次构图求...

POJ - 1364 巧妙构图的差分约束

题目的意思抽象出来就是有一个数列...a1,a2...an..现在给出每段的关系..若 a1+a2 > 0  ,  a2+a3    构图也就是将问题转化为差分约束.... 首先用s [ i ]...
  • kk303
  • kk303
  • 2011年10月09日 21:57
  • 792

POJ 3189 Steady Cow Assignment(网络流之最大流+二分构图)

题目地址:POJ 3189 我晕啊。。。飞快的把白天的任务完成又有什么用。。。节省下来的时间活生生的被我的手残给全浪费掉了。。。又调了一整天,问题居然是一个地方的n和m写反了!!!反思。。反思。。。...

POJ 1087 A Plug for UNIX 会议室插座问题 构图+最大流

题目链接:POJ 1087 A Plug for UNIX A Plug for UNIX Time Limit: 1000MS   Memory Li...

POJ 1149 PIGS 迈克卖猪问题 网络流构图+三种AC方法

题目链接:POJ 1149 PIGS PIGS Time Limit: 1000MS   Memory Limit: 10000K Total...

poj 2226 匈牙利匹配 一种构图方法

关于匈牙利算法的描述可以去看 http://blog.csdn.net/winoros/article/details/18949489 下面贴出题目的description Muddy ...

poj2455二分构图网络流

Farmer John is constructing a new milking machine and wishes to keep it secret as long as possible.
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ-2135 自己构图WA了..参考了别人的构图..
举报原因:
原因补充:

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