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 ...
随机推荐
- 获取股票历史数据和当前数据的API
关键字:股票,stock,API,接口 1.获取股票当前数据 新浪数据接口:http://hq.sinajs.cn/list={code}.{code}替换为股票代码,沪市股票代码加前缀sh,深市股票 ...
- Flasback数据库(闪回数据库)
数据库闪回原理: 一旦启用了闪回数据库,修改的块映像会不时从数据库缓冲区复制到闪回缓冲区.通过新的后台恢复写入器(Recovery Writer, RVWR)将此闪回缓冲区内容刷新到磁盘和闪回日志接着 ...
- Hibernate从入门到精通(三)Hibernate配置文件
在上次的博文Hibernate从入门到精通(二)Hibernate实例演示我们已经通过一个实例的演示对Hibernate的基本使用有了一个简单的认识,这里我们在此简单回顾一下Hibernate框架的使 ...
- 洛谷 P1858 多人背包
求01背包前k优解的价值和 输入输出格式 Input/output 输入格式:第一行三个数K.V.N(k<=50,v<=5000,n<=200)接下来每行两个数,表示体积和价值输出格 ...
- Xcode常用快捷键及代码格式刷(缩进)方法-b
Xcode版本:4.5.1 一.总结的常用命令: 隐藏xcode command+h 退出xcode command+q 关闭窗口 command+w 关闭所有窗口 command+option+w ...
- linux学习笔记(1)-文件处理相关命令
列出文件和目录 ls (list) #ls 在终端里键入ls,并回车,就会列出当前目录的文件和目录,但是不包括隐藏文件和目录 #ls -a 列出当前目录的所有文件 #ls -al 列出当前目的所有文件 ...
- HTML标签<b>与<strong>以及<i>与<em>的区别
在一般情况下,<b>和<strong>标签的显示效果一样,<i>和<em>标签的显示效果一样.那么它们的区别在哪呢?我们应该使用哪种标签呢? 在w3sc ...
- 一个简单的aJax——后台用servlet技术
示例:webDemo 一.客户端 <%-- Created by IntelliJ IDEA. User: Administrator Date: 15-12-2 Time: 上午5:41 To ...
- Connect to the mysql dataase from remote server
Make sure that the firewall is closed!!!!!!!!! shell command should be like is: mysql -u username -p ...
- 深入剖析Classloader(一)--类的主动使用与被动使用
原文地址:http://yhjhappy234.blog.163.com/blog/static/3163283220115573911607 我们知道java运行的是这样的,首先java编译器将我们 ...