poj 2135最小费用最大流

原创 2013年12月06日 00:18:51

最小费用最大流问题是经济学和管理学中的一类典型问题。在一个网络中每段路径都有“容量”和“费用”两个限制的条件下,此类问题的研究试图寻找出:流量从A到B,如何选择路径、分配经过路径的流量,可以在流量最大的前提下,达到所用的费用最小的要求。如n辆卡车要运送物品,从A地到B地。由于每条路段都有不同的路费要缴纳,每条路能容纳的车的数量有限制,最小费用最大流问题指如何分配卡车的出发路径可以达到费用最低,物品又能全部送到。

#include<stdio.h>

#include<queue>
#include<iostream>
#define inf  999999999
using namespace std;
#define N 11000
struct node {
int u,v,c,f,next;
}bian[N*4];
int dis[N],yong,head[N],sum,pre[N],n;
void Ad(int u,int v,int c,int f) {
bian[yong].u=u;
bian[yong].v=v;
bian[yong].c=c;//权值
bian[yong].f=f;//能用几次
bian[yong].next=head[u];//head数组用来记录上一个边的下标
head[u]=yong++;//当前边的下标
}
void Add(int u,int v,int c,int f) {
Ad(u,v,c,f);
Ad(v,u,-c,0);
}
int spfa(int s,int t) {//单源最短路采取的方法是动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。
//定理: 只要最短路径存在,上述SPFA算法必定能求出最小值。
//证明:每次将点放入队尾,都是经过松弛操作达到的。换言之,每次的优化将会有某个点v的最短路径估计值d[v]变小。所以算法的执行会使d越来越小。由于我们假定图中不存在负权回路,所以每个结点都有最短路径值。因此,算法不会无限执行下去,随着 d值的逐渐变小,直到到达最短路径值时,算法结束,这时的最短路径估计值就是对应结点的最短路径值


int i,visit[N],cur;
memset(pre,-1,sizeof(pre));
memset(visit,0,sizeof(visit));
for(i=0;i<=n+1;i++)
dis[i]=inf;
queue<int>q;
dis[0]=0;
q.push(0);
visit[0]=1;
while(!q.empty()) {
       cur=q.front();
  q.pop();
  for(i=head[cur];i!=-1;i=bian[i].next) {//因为0是在建所有有效边之后故将所有的边都依次加入
 int  v=bian[i].v;
  if(bian[i].f&&dis[v]>dis[cur]+bian[i].c) {//加了点cur之后进行路径松弛
  dis[v]=dis[cur]+bian[i].c;
  pre[v]=i;//记录当前点连接的边的下标
  if(visit[v]==0) {//dis[v]已经有所改变如果不在队列里就把它放到队尾
  visit[v]=1;
  q.push(v);
  }
  }
  }
  visit[cur]=0;
  }
if(dis[t]==inf)
return 0;
return  1;
}
void cou(int t) {
int i,j;
i=pre[t];//连接t的边进而可以得出连接t的点
while(i!=-1) {
j=i^1;
bian[i].f--;
bian[j].f++;
sum+=bian[i].c;
i=pre[bian[i].u];//bian[i].u连接的边
}
}
int main() {
int m,a,b,c;
while(scanf("%d%d",&n,&m)!=EOF) {
yong=0;
memset(head,-1,sizeof(head));
while(m--) {
scanf("%d%d%d",&a,&b,&c);
Add(a,b,c,1);
Add(b,a,c,1);
}
Add(0,1,0,2);
Add(n,n+1,0,2);
sum=0;
while(spfa(0,n+1))  {
 cou(n+1);
}
printf("%d\n",sum);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

poj 2135 最小费用最大流 EK+SPFA

传送门 题意:n个点m条边,从1出发到n,再从n返回1,不走重复的边,求路程最少是多少。 个人心得:无向图的网络流,一开始对于建双边还心存不解,后来想着想着就想明白了,明白了就好。 思路:能从1...

POJ 2135 Farm Tour (最小费用最大流)

题意:FJ带他的朋友参观农场,他们的起点是1,终点是N, 点与点之间可能存在路径。现在要求从1到N,在从N回到1所走的最短路程。并且返回时已经被走过的路不能再走! 题解:最小费用流。每条路只走一次,...
  • Tsaid
  • Tsaid
  • 2011年10月25日 21:41
  • 499

POJ2135(最小费用最大流)

建立一个超级源点到1这个点的容量为2,费用为0,超级汇点同理,模版题。 #include #include #include #include #include #include #in...

poj 2135 Farm Tour 【无向图最小费用最大流】

题目:poj 2135 Farm Tour  题意:给出一个无向图,问从 1 点到 n 点然后又回到一点总共的最短路。 分析:这个题目不读仔细的话可能会当做最短路来做,最短路求出来...

poj 2135 Farm Tour(最小费用最大流)

Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14241   Accepted: 5430 ...

【最小费用最大流+邻接表】POJ 2135

因为有两条不同路径,所以可以这样构图:超级源点s->1,容量为2,边权为0,n->超级汇点t,容量为2,边权为0,其他的点容量为1,边权是输入的数据,这样就保证了肯定有两条不同的路径,而且模型肯定满流...
  • leolin_
  • leolin_
  • 2012年01月20日 04:34
  • 653

poj 2135 Farm Tour(最小费用最大流模板)

Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14530   Acc...
  • acm_cxq
  • acm_cxq
  • 2016年06月02日 00:15
  • 271

poj2135(*最小费用最大流)

/* translation: 给出一张图,求从1~n再从n~1的最短路径是多少?注意同一条路径不能走两次! solution: 最小费用最大流 这个问题可以转化为求2条从1~...

poj 2135 Farm Tour 最小费用最大流模板题

传送门:poj 2135 Farm Tour 描述: Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submi...

POJ 2135 Farm Tour(最小费用最大流 模板题)

POJ 2135 Farm Tour(最小费用最大流 模板题)
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 2135最小费用最大流
举报原因:
原因补充:

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