题意:给一个无向图,FJ要从1号点出发到达n号点,再返回到1号点,但是路一旦走过了就会销毁(即回去不能经过),每条路长度不同,那么完成这趟旅行要走多长的路?(注:会有重边,点号无序,无向图!)

思路:

  有重边,要用邻接表。所给的每条边都要变成4条有向边!否则可能一开始就到达不了终点了。最后要再加上一个源点和汇点,容量cap(源点,1)=2,指定只能走两次,再规定其他所给的边的容量是1就行了,当边被走过了,就自动增加了流,也就走不了了。

  解释看代码更清晰。

 //#pragma comment(linker,"/STACK:102400000,102400000")
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <stack>
#include <algorithm>
#include <map>
//#include <bits/stdc++.h>
#define LL long long
#define pii pair<int,int>
#define INF 0x7f7f7f7f
using namespace std;
const int N=+;
vector<int> vect[N];
struct node
{
int from;
int to;
int cost;
int cap;
int flow;
}edge[N*]; //边数是4*M的大小 int edge_num; //边的上限
int f[N]; //流
int path[N]; //记录路径
int c[N]; //记录费用
bool in[N]; //是否在queue中 void add_node(int a, int b, int c, int ca, int fl)
{
edge[edge_num].from=a;
edge[edge_num].to=b;
edge[edge_num].cost=c;
edge[edge_num].cap=ca;
edge[edge_num].flow=fl;
vect[a].push_back(edge_num++);
} LL spfa(int s,int e)
{
deque<int> que;
que.push_back(s);
c[s]=;
f[s]=INF;
in[s]=;
while(!que.empty())
{
int x=que.front();
que.pop_front();
in[x]=;
for(int i=; i<vect[x].size(); i++)
{
node t=edge[vect[x][i]];
if(t.cap>t.flow && c[t.to]>c[t.from]+t.cost) //能流过,且费用更小即可更新。
{
path[t.to]=vect[x][i]; //记边号,方便更新flow
c[t.to]=c[t.from]+t.cost; //更新cost,相当于距离
f[t.to]=min(f[t.from], t.cap-t.flow);
if(!in[t.to])
{
que.push_back(t.to);
in[t.to]=;
}
}
}
}
return c[e];
} int m; int mcmf(int s, int e)
{
LL ans=;
while()
{
memset(f, , sizeof(f));
memset(c, 0x7f, sizeof(c));
memset(in, , sizeof(in));
memset(path, , sizeof(path)); int tmp=spfa(s, e);
if(tmp==INF) return ans;
ans+=tmp*f[e]; //这是最小费用。注:每次的流可能不是1。 int ed=e;
while(ed!=s)
{
int en=path[ed];
edge[en].flow+=f[e];
edge[en^].flow-=f[e];
ed=edge[en].from;
//cout<<edge[en].from<<"-"<<edge[en].to<<endl;
}
}
} int main()
{
freopen("input.txt", "r", stdin);
int n, a, b, c;
while(~scanf("%d%d", &n, &m))
{
for(int i=n*; i>=; i--) vect[i].clear();
edge_num=;
for(int i=; i<m; i++)
{
scanf("%d%d%d",&a,&b,&c);
add_node(a,b,c,,); //4条有向边。
add_node(b,a,-c,,); add_node(b,a,c,,);
add_node(a,b,-c,,);
}
add_node(,,,,); //加多2条边
add_node(,,,,); //加这条无意义,但是更新flow时更方便
add_node(n,n+,,,);
add_node(n+,n,,,); printf("%lld\n",mcmf(, n+));
} return ;
}

AC代码

POJ 2135 Farm Tour(最小费用最大流,变形)的更多相关文章

  1. poj 2135 Farm Tour 最小费用最大流建图跑最短路

    题目链接 题意:无向图有N(N <= 1000)个节点,M(M <= 10000)条边:从节点1走到节点N再从N走回来,图中不能走同一条边,且图中可能出现重边,问最短距离之和为多少? 思路 ...

  2. POJ 2135 Farm Tour [最小费用最大流]

    题意: 有n个点和m条边,让你从1出发到n再从n回到1,不要求所有点都要经过,但是每条边只能走一次.边是无向边. 问最短的行走距离多少. 一开始看这题还没搞费用流,后来搞了搞再回来看,想了想建图不是很 ...

  3. poj 2351 Farm Tour (最小费用最大流)

    Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17230   Accepted: 6647 Descri ...

  4. [poj] 1235 Farm Tour || 最小费用最大流

    原题 费用流板子题. 费用流与最大流的区别就是把bfs改为spfa,dfs时把按deep搜索改成按最短路搜索即可 #include<cstdio> #include<queue> ...

  5. POJ2135 Farm Tour —— 最小费用最大流

    题目链接:http://poj.org/problem?id=2135 Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  6. TZOJ 1513 Farm Tour(最小费用最大流)

    描述 When FJ's friends visit him on the farm, he likes to show them around. His farm comprises N (1 &l ...

  7. Farm Tour(最小费用最大流模板)

    Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18150   Accepted: 7023 Descri ...

  8. POJ 2135 Farm Tour (费用流)

    [题目链接] http://poj.org/problem?id=2135 [题目大意] 有一张无向图,求从1到n然后又回来的最短路 同一条路只能走一次 [题解] 题目等价于求从1到n的两条路,使得两 ...

  9. poj 2135 Farm Tour 最小费最大流

    inf开太小错了好久--下次还是要用0x7fffffff #include<stdio.h> #include<string.h> #include<vector> ...

  10. POJ 2135 Farm Tour (网络流,最小费用最大流)

    POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...

随机推荐

  1. 【转】perl如何避免脚本在windows中闪一下就关闭

    写好了perl程序,运行后,准备等待结果输出时,结果双击后,看到屏幕闪了一下,然后什么都没有了,根本没有机会然你看到输出的结果 当你刚开始学习perl的时候,写好了程序,准备兴高采烈的等待结果输出时, ...

  2. Fedora 17安装NFS

    1.NFS概述 NFS(Network File System)是一种分布式文件系统,允许网络中的安装不同操作系统的计算机间共享文件和外设,所以它的通讯协定设计与主机及作业系统无关. 它是由SUN公司 ...

  3. 【git】学习路径失败了

    期初规划:搭建git远程服务器  使用gitlab作为管理工具 过程遇到的问题 1.gitlab不能安装到win ,且对centos要求6以上,我只有一台centos5  让运维帮升级 ...等待.. ...

  4. 进程(Process)和线程(Thread)的关系和区别

    Definition定义-------------Process进程是应用程序的一次运行活动:从操作系统核 心角度来说,进程是操作系统分配和调度系统内存资源.cpu时间片等资源的基本单位,为正在运行的 ...

  5. 2016 系统设计第一期 (档案一)MVC 引用 js css

    @Styles.Render("~/Bootstrap/css/bootstrap-theme.css") @Scripts.Render("~/jQuery/jquer ...

  6. PS 颜色表大全-CMYK颜色表(2)

    CMYK颜色表 编号 C M Y K R G B 16进制值 1 0 100 100 45 139 0 22 8B0016 2 0 100 100 25 178 0 31 B2001F 3 0 100 ...

  7. 【学习总结】OS X , IOS , IOS SDK , XCode之间的关系

    几个基本的概念 : OS X : 属于桌面PC级别(IMac,MacPro等)对应安装的操作系统 IOS : 属于移动设备级别(Iphone,Ipad等)对应安装的操作系统 XCode: 是一个IDE ...

  8. 【BZOJ1305】 [CQOI2009]dance跳舞

    Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...

  9. git初探

    1 Linux下Git和GitHub环境的搭建 第一步: 安装Git,使用命令 "sudo apt-get install git" 第二步: 到GitHub上创建GitHub帐号 ...

  10. struts2+hibernate-jpa+Spring+maven 整合(1)

    1.0.0 struts2 与 spring 的整合. 1.1.0 新建maven工程 , 编写pom.xml ,这里只需要简单的添加 一个组件就够了: 在myeclipse 生成的pom.xml 添 ...