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

POJ 2135(费用流基础题) POJ 2135题目大意有N个点M条双向边的图,求从起点1到终点N的两条边不相交的路径,要求这两条路径长度的总和最小,输出最小长度分析肯定不能通过贪心的方法先求一条再求一条。我们可以换一种方式来描述问题:有两个人要从节点1走到节点2,要求他们不能走同一条道路,问他们走的总路程的最小值是多少。费用流问题(MCMF)是解决每条边有容量限制,每条边上有单位流量的花费,求在一定流量下的最小花费的问题。通过重 阅读详情

题目链接:http://poj.org/problem?id=2135


Farm Tour
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 17672 Accepted: 6851

Description

When FJ's friends visit him on the farm, he likes to show them around. His farm comprises N (1 <= N <= 1000) fields numbered 1..N, the first of which contains his house and the Nth of which contains the big barn. A total M (1 <= M <= 10000) paths that connect the fields in various ways. Each path connects two different fields and has a nonzero length smaller than 35,000. 

To show off his farm in the best way, he walks a tour that starts at his house, potentially travels through some fields, and ends at the barn. Later, he returns (potentially through some fields) back to his house again. 

He wants his tour to be as short as possible, however he doesn't want to walk on any given path more than once. Calculate the shortest tour possible. FJ is sure that some tour exists for any given farm.

Input

* Line 1: Two space-separated integers: N and M. 

* Lines 2..M+1: Three space-separated integers that define a path: The starting field, the end field, and the path's length. 

Output

A single line containing the length of the shortest tour. 

Sample Input

4 5
1 2 1
2 3 1
3 4 1
1 3 2
2 4 2

Sample Output

6

Source




题解:

把问题转化为:最小费用最大流。

1.每一条边其容量为1, 其费用为距离。

2.可知题目要求两条不同的路径,那么对于这个网络流图,就是要求:在流量为2的状态下,1到n的最小费用。

3.那么怎么转化为最小费用最大流呢?设一个超级源点和一个超级汇点。且超级源点到1的容量为2,费用为0, n到超级汇点的容量为2,费用为0;且题目说明了必定有解,那么在这个条件下求超级源点到超级汇点的最小费用最大流,最大流就只能为2了。所以最小费用即为题目所求。



代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
#define ms(a,b) memset((a),(b),sizeof((a)))
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
const int mod = 1e9+7;
const int MAXN = 1e3+10;

struct Edge
{
    int to, next, cap, flow, cost;
}edge[10010<<2];
int tot, head[MAXN];
int pre[MAXN], dis[MAXN];
bool vis[MAXN];
int N;

void init(int n)
{
    N = n;
    tot = 0;
    memset(head, -1, sizeof(head));
}

void add(int u, int v, int cap, int cost)
{
    edge[tot].to = v;
    edge[tot].cap = cap;
    edge[tot].cost = cost;
    edge[tot].flow = 0;
    edge[tot].next = head[u];
    head[u] = tot++;

    edge[tot].to = u;
    edge[tot].cap = 0;
    edge[tot].cost = -cost;
    edge[tot].flow = 0;
    edge[tot].next = head[v];
    head[v] = tot++;
}

bool spfa(int s, int t)
{
    queue<int>q;
    for(int i = 0; i<N; i++)
    {
        dis[i] = INF;
        vis[i] = false;
        pre[i] = -1;
    }

    dis[s] = 0;
    vis[s] = true;
    q.push(s);
    while(!q.empty())
    {
        int u  = q.front();
        q.pop();
        vis[u] = false;
        for(int i = head[u]; i!=-1; i = edge[i].next)
        {
            int v = edge[i].to;
            if(edge[i].cap>edge[i].flow && dis[v]>dis[u]+edge[i].cost)
            {
                dis[v] = dis[u]+edge[i].cost;
                pre[v] = i;
                if(!vis[v])
                {
                    vis[v] = true;
                    q.push(v);
                }
            }
        }
    }
    if(pre[t]==-1) return false;
    return true;
}

int minCostMaxFlow(int s, int t, int &cost)
{
    int flow = 0;
    cost = 0;
    while(spfa(s,t))
    {
        int Min = INF;
        for(int i = pre[t]; i!=-1; i = pre[edge[i^1].to])
        {
            if(Min>edge[i].cap-edge[i].flow)
                Min = edge[i].cap-edge[i].flow;
        }
        for(int i = pre[t]; i!=-1; i = pre[edge[i^1].to])
        {
            edge[i].flow += Min;
            edge[i^1].flow -= Min;
            cost += edge[i].cost*Min;
        }
        flow += Min;
    }
    return flow;
}

int main()
{
    int n, m;
    scanf("%d%d",&n,&m);
    init(n+2);
    for(int i = 1; i<=m; i++)
    {
        int u, v, c;
        scanf("%d%d%d",&u,&v,&c);
        add(u,v,1,c);   //双向图,容量为1,花费即为距离c
        add(v,u,1,c);
    }
    add(0,1,2,0);   //超级源点到1的边,单向。容量为2, 花费为0
    add(n, n+1, 2,0);  //n到超级汇点的边,单向。容量为2, 花费为0
    int ans;
    minCostMaxFlow(0,n+1,ans);
    printf("%d\n", ans);
    return 0;
}


VIVADO网表文件DCP和EDF 为了便于模块化设计,同时保护自己的知识产权,Xilinx VIVADO 提供两种代码封装方法:DCP文件和edf文件。 阅读详情

相关推荐

MATLAB实战:64QAM通信系统仿真全流程解析(附误码率优化技巧)

本文提供了一份完整的64QAM通信系统MATLAB仿真实践指南。从系统架构设计、发射端格雷码映射与脉冲成形,到信道建模、接收端同步与均衡,详细解析了全链路实现流程。文章重点分享了误码率曲线与理论值偏差的排查清单和深度优化技巧,帮助工程师构建工业级精度的仿真模型,解决高阶调制系统仿真的核心难题。

jenkins8butler的博客 404

poj2135(最小费用最大流入门)

Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18976 Accepted: 7334 Description When FJ’s friends visit him on the farm, he likes to show them around. His farm comprises N ...

qq_36386435的博客 405

手把手调试Altera FPGA远程升级:从ASMI扇区擦除到Remote Update IP配置的避坑实录

本文详细解析了Altera FPGA远程升级的全流程,重点介绍了Cyclone IV系列FPGA的ASMI扇区擦除和Remote Update IP配置的实战技巧。通过双镜像架构设计、ASMI IP核优化配置及Remote Update IP的隐藏参数设置,帮助开发者避免常见陷阱,提升远程升级的可靠性和效率。

weixin_30872499的博客 447

poj2135(最小费用最大流)

1.思路:题目要求求出两条路径,一条正向另一条反向,并且边不走重复,因此可以转换为费用流的模型,i至j有边(无向)拆成4条边,边的容量分别至1或0 因此可以保证每条边至多走一次。再建立源s,汇t,另w(s,1)=w(n-2,t)=2;w(,1,s)=w(t,n-2)=0;c(s

ysjjovo的专栏 959

手把手教你学Simulink--基于Simulink的微电网用DC-DC变换器仿真建模

微电网概述微电网:包括可再生能源发电设备、储能系统和负载,可以独立于大电网运行,也可以并网运行。重要性提高能源可靠性:通过本地化供电减少对外部电网的依赖。促进可再生能源利用:支持高效整合多种可再生能源。挑战多源管理:不同类型的能源产生方式各异,需设计灵活的电源管理系统。能量转换效率:需要高效的能量转换装置来确保能源的有效利用。通过上述步骤,我们简要介绍了如何基于Simulink进行微电网中DC-DC变换器的仿真建模。

MHD0815的博客 162

【EB_Tresos专题】-01-EB Tresos导入工程

<--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--> <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--> 结尾 ...

「汽车电子助手」的博客 6436

poj 2135

思路:由于要求两条不重合边的单源最短路,所以可以考虑用最小费用最大流来做。 设虚拟起点vstart到1的容量为2,cost为0,虚拟终点vend到n的容量为2,cost为1,其他的边的容量为1,cost为输入的值。 那么其实就是求这个构造的图的最小费用最大流了。 我看到很多都是用next数组神马的,啊啊,对于我这样的懒家伙,于是想用vector。硬是把它给过了。 提示:边是双向的,所以要加

Simmu 580

【人工智能】全面盘点国内AI九大模型:各擅胜场的智能先锋(豆包、文心一言、讯飞星火、通义千问、Kimi、智谱清言、腾讯元宝、秘塔、天工AI)

追求性价比与全能:选豆包,适合个人与中小企业日常使用;侧重中文创作与理解:选文心一言,文学与商业文案创作首选;需要专业语音交互:选讯飞星火,智能客服、车载场景必备;看重生态与多场景:选通义千问,适配电商、办公等企业需求;处理超长文本任务:选Kimi,文档分析、学术研究的利器;专注深度推理创作:选智谱清言,学术与创意写作的伙伴;依赖腾讯生态协同:选腾讯元宝,日常轻量需求的便捷之选;深耕法律学术领域:选秘塔,专业文本处理的权威工具;布局前沿技术体验:选天工AI,享受接近国际顶尖的智能服务。

奶爸的编程之路,也就一周冷个三天 1123

POJ2135 Farm Tour(网络流)

所有人!都过来! 【题目分析】 一开始完全没想到是网络流啊。。。。。。做了两次最短路发现有反例所以gg。 其实我觉得单源最短路可以算作网络流的特殊情况,所有连边容量为1,费用为w,建立超级源点s和超级汇点t,s向起点连容量为1费用为0的边,终点向t连容量为1费用为0的边,跑一遍最小费用最大流,最后的费用就是最短路长度。 回到这道题,因为要走个来回并且费用最少,所以将s与起点、t与终点的连边...

Michael_GLF的博客 266

AutoSAR EcuM系列01- EcuM模块的功能概述和变体类型

在【ECU的软硬件架构】文章中我们了解ECU的功能和组成,那么ECU具体是怎么启动的呢?我们知道,AutoSAR标准架构有三层,即APPL应用层、RTE层和BSW层。而这些层又被进一步划分为更多单独的组件,如BSW层可能有80多个组件。在ECU启动时,这些组件必须相互交互,有时也必须以某种顺序交互。这些组件的启动顺序由ECU管理器模块或EcuM处理。EcuM负责整个ECU的初始化和去初始化,包括对一些系统模块如。......

1767

科研绘图系列:基因突变瀑布图统计以及可视化

科研绘图系列:基因突变瀑布图统计以及可视化

专注生信领域 1655

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

传送门:poj 2135 Farm Tour 描述: Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15031   Accepted: 5756 Description When FJ's friends visit h

魔笛手的博客 1749

利用R批量计算相关系数

批量求相关系数

weixin_52073820的博客 1459

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

题目:poj 2135 Farm Tour  题意:给出一个无向图,问从 1 点到 n 点然后又回到一点总共的最短路。 分析:这个题目不读仔细的话可能会当做最短路来做,最短路求出来的不一定是最优的,他是两条分别最短,但不一定是和最短。 我们可以用费用流来很轻易的解决,建边容量为1,费用为边权,然后源点s连 1 ,费用0 ,容量 2 ,n点连接汇点,容量2,费用0,,就可以了。

大神养成中..... 4637

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

POJ2135 Farm Tour 【最小费用最大流】

Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11782   Accepted: 4393 Description When FJ's friends visit him on the farm, he likes to show them

长风的专栏 1080

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

POJ 2135Farm Tour——最小费用最大流模板

点这里 题意: 给定一个无向图,有n个地点、m条边。一个人从1号点走到n号点,再从n号点走回1号点,每条路只能走一次。求一个来回的总长度最短的路线。 题解: 既然是无向图,那么题目就可以转换成从1号点到n号点至少有两条不同的路径,找其中两条,是他们的总长度最短。   这一题实际上是最小费用最大流的裸题,建模如下:   把每条边的流量设为1,表示每条边只能用1次,把边的长度看成每条边的费用。在图中添加一个超级源点S和一个超级汇点T,S到1的有一个长度为0、容量为2的边,n到T有一个长度为0、容量...

lllllan 279

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13464   Accepted: 5101 Description When FJ's friends visit him on the farm, he likes to show them a

世界很大 1157

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

When FJ's friends visit him on the farm, he likes to show them around. His farm comprises N (1 <= N <= 1000) fields numbered 1..N, the first of which contains his house and the Nth of which con...

Top_Spirit的博客 298

Farm Tour POJ - 2135 最小费用最大流

传送门:POJ2135 题意:给出n个点和m条边,每条边只能走一次,问从1走到n再走回1的最小路程是多少。 思路:看完题我第一反应这不是最短路么。。求两遍最短路就好了啊。。仔细想想却很难实现,因为有重边,所以要用链式前向星法建图,但这样的话就会很难删边。 正解:最小费用最大流,源点到1号点容量为2,N号点到汇点容量为2,其余点之间容量为1,费用为边长,跑一遍最小费用最大流就好了。。 看di

WA是一笔财富 478

poj2135 Farm Tour 最小费用最大流

FJ带朋友参观自己的农场,从自己的房子出发到barn(谷仓、畜棚或车库),再从barn返回自己的房子,要求去回不走同一条路。 建图:取超级源点,并与房子连一条边,容量为2;取barn与超级汇点间的边的容量为2,中间的建图方法如代码。 因为此题是无向图,所以建边的时候如果建两条费用都是正的边的话,退流时无法修正费用。 所以应该建4条边: 第一对: a->b cost 1 b->a -cost

u013087645的专栏 774

POJ 2135 Farm Tour 最小费用最大流 -

题目地址:http://poj.org/problem?id=2135 由于去和回来可以看成:2条从1到n的不同的路。所以转化成求从1到n的两条不同的路。 建立一个源点,连接1号景点,无费用,容量为2(表示可以有两条路) 同理,建立一个汇点,连接n号景点,无费用,容量为2. 这样,如果求的的最大流是2,就表示了有两条从1到n的不同的路。(因为中间的点边容量只是1,只能用一次) 这样求

BRCOCOLI的博客 392

Farm Tour 【POJ - 2135】【最大流最小费用】

题目链接 这道题就是在说,我们需要跑一圈(不能经过相同的路径),问最小经历的权值是多少? 不过是建一次最大流最小费用,但是这道题有坑点,因为是无向边,所以建边不能简单的去建,要考虑很多的东西,我们可以这样子建边: a&lt;--&gt;b的边: a-&gt;b flow, cost; b-&gt;a flow, - cost; b-&gt;a flow, cost; a-&g...

既然弱小,就只顾变强就是了 254

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

POJ - 2135 - Farm Tour(最小费用最大流) When FJ’s friends visit him on the farm, he likes to show them around. His farm comprises N (1 &lt;= N &lt;= 1000) fields numbered 1…N, the first of which contains his ...

weixin_43179892的博客 255

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

POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprises N (1 <= N <= 1000) fields numbered 1..N, the first of ...

dipinzhu4111的博客 175

poj2135Farm Tour——最小费用最大流

题目要求从1到n走一遍再从n到1走一遍而且有重边,相当于从1到n走两边 所以加一个源点01,费用为0,流量为2 加一个汇点n+1n,费用为0,流量为2 中间的边流量为1(只走一遍),费用为c 然后一遍0->n+1的费用流 要注意是无向图,所以一个输入有4条边 a->b ,c,1 b->a ,-c,0 b->a ,c,1 a->b ,c,0 type point=reco

zz_ylolita 598

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

最小费用最大流:保证最大流的同时使得费用最小 这道题要求从1-n和n-1总的最短路径,模拟每条路流量为1,费用为路径长度,用spfa进行处理,并设置源点和汇点(费用0,流量2),模拟最小费用最大流 E'K'算法(把EK的bfs寻路换成spfa即可) #include<iostream> #include<cstring> #include<cstdio>...

STOP 204
上一篇: HDU1532 Drainage Ditches —— 最大流(sap算法)
下一篇: POJ2914 Minimum Cut —— 最小割
DOLFAMINGO
博客等级 码龄10年 8粉丝 216原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值