POJ 2135 Farm Tour(最小费用最大流,变形)
题意:给一个无向图,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(最小费用最大流,变形)的更多相关文章
- poj 2135 Farm Tour 最小费用最大流建图跑最短路
题目链接 题意:无向图有N(N <= 1000)个节点,M(M <= 10000)条边:从节点1走到节点N再从N走回来,图中不能走同一条边,且图中可能出现重边,问最短距离之和为多少? 思路 ...
- POJ 2135 Farm Tour [最小费用最大流]
题意: 有n个点和m条边,让你从1出发到n再从n回到1,不要求所有点都要经过,但是每条边只能走一次.边是无向边. 问最短的行走距离多少. 一开始看这题还没搞费用流,后来搞了搞再回来看,想了想建图不是很 ...
- poj 2351 Farm Tour (最小费用最大流)
Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17230 Accepted: 6647 Descri ...
- [poj] 1235 Farm Tour || 最小费用最大流
原题 费用流板子题. 费用流与最大流的区别就是把bfs改为spfa,dfs时把按deep搜索改成按最短路搜索即可 #include<cstdio> #include<queue> ...
- POJ2135 Farm Tour —— 最小费用最大流
题目链接:http://poj.org/problem?id=2135 Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- 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 ...
- Farm Tour(最小费用最大流模板)
Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18150 Accepted: 7023 Descri ...
- POJ 2135 Farm Tour (费用流)
[题目链接] http://poj.org/problem?id=2135 [题目大意] 有一张无向图,求从1到n然后又回来的最短路 同一条路只能走一次 [题解] 题目等价于求从1到n的两条路,使得两 ...
- poj 2135 Farm Tour 最小费最大流
inf开太小错了好久--下次还是要用0x7fffffff #include<stdio.h> #include<string.h> #include<vector> ...
- POJ 2135 Farm Tour (网络流,最小费用最大流)
POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...
随机推荐
- ARM-Linux S5PV210 UART驱动(1)----用户手册中的硬件知识
一.概述 The Universal Asynchronous Receiver and Transmitter (UART) in S5PV210 provide four independent ...
- 【BZOJ 1563】 [NOI2009]诗人小G
Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超过1018,则输出"Too hard to arr ...
- 【BZOJ1468】Tree
Description 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K Input N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是 ...
- 基于SuperSocket实现的WebSocket(前端)
本文内容是搭配后端使用的,没看过WebSocket后端实现的童鞋们戳这里 咳咳,其实前端实现相对就容易很多了,因为我们有JavaScript WebSocket Api,它看上来大致是这样的: var ...
- Jquery实现自动提示下拉框
1.引入脚本库: <script type="text/javascript" src="/Jscripts/jquery-1.3.2.js"&g ...
- poj 3522 Slim Span (最小生成树kruskal)
http://poj.org/problem?id=3522 Slim Span Time Limit: 5000MS Memory Limit: 65536K Total Submissions ...
- 1049: [HAOI2006]数字序列 - BZOJ
Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大.Input 第一行包含一个数n ...
- 3141: [Hnoi2013]旅行 - BZOJ
Description Input 第一行为两个空格隔开的正整数n, m,表示旅行的城市数与旅行所花的月数.接下来n行,其中第 i行包含两个空格隔开的整数Ai和Bi,Ai表示他第i个去的城市编号.Bi ...
- 【斜率DP】bzoj1597: [Usaco2008 Mar]土地购买
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2474 Solved: 900[Submit][ ...
- 入侵HP打印机的文件系统
计算机入侵可听多了,然而打印机入侵相信大家可很少听过吧.如今,很大一部分的打印机已经网络化了,能入侵和控制打印机不仅能用来进行DDOS,而内部的文件系统更是绝好的秘密文件收藏空间.现在就来谈谈如何入侵 ...