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
  • 974

poj 3281 (最大流,构图)

题意:每头牛有想吃的食物和饮料,每头牛最多只能吃一种食物和一种饮料,给出牛的个数,食物和饮料的种类数,每头牛想要的食物和饮料的种类。 刚开始想着把牛放中间,从汇点到食物,食物到牛,牛到饮料,饮料到汇...

POJ 1161 Floyd 构图

AC~ 调试了N久的一道题啊~~ 还是英语不行,把题中的变量意义读错了!结果怎么调试怎么不过啊~~悲剧悲剧哦~ 总算是过了~~ ----------------------...

POJ 3126 --Father Christmas flymouse【scc缩点构图 && SPFA求最长路】

Father Christmas flymouse Time Limit: 1000MS   Memory Limit: 131072K Total Submissio...

poj 2536 Gopher II(二分图最大匹配,构图)

Gopher II Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8347   Acce...

POJ--1698[Alice's Chance] 网络流构图

题意:有N个film,告诉你每个film能在一周(周一...周末)中的几天去做,还告诉你每个film要在前W周完成D次。问你能否按要求完成所有film。(每天最多只能做一个film一次) 思路:把题目...

POJ--1659--Frogs' Neighborhood【Havel-Hakimi定理构图】

链接:http://poj.org/problem?id=1659 题意:有n个湖泊,如果湖泊A和湖泊B之间有水路连接,则称他们互为邻居,现给出n个湖泊的邻居个数,如果他们可以构成一个图则输出YES和...

POJ 3020-Antenna Placement(二分图匹配_最小路径覆盖+前向星构图)

Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6930 ...

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

题目的意思抽象出来就是有一个数列...a1,a2...an..现在给出每段的关系..若 a1+a2 > 0  ,  a2+a3    构图也就是将问题转化为差分约束.... 首先用s [ i ]...
  • kk303
  • kk303
  • 2011-10-09 21:57
  • 779
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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