题目链接

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

思路:很经典的构图(看题解的);每条原图中的边赋予cap为1,表示只走一次。超级源点s和汇点t分别和起点终点连边,cap为2,这里cap为2就直接限制了只能有两次最大流;同时最大流中以权值限制得到的就是最小费用;很注意的一点就是此题为无向图带权值,建图时每条有向边建成两条即总边数为4*M。由于spfa找最短路是有方向的,所以这样并不会出现一条边找两次的可能;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
#include<stack>
#include<set>
#include<map>
#include<queue>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define MSi(a) memset(a,0x3f,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m+1, r, rt << 1|1
typedef long long ll;
#define A first
#define B second
#define MK make_pair
typedef __int64 ll;
template<typename T>
void read1(T &m)
{
T x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
template<typename T>
void out(T a)
{
if(a>) out(a/);
putchar(a%+'');
}
int T,kase = ,i,j,k,n,m,s,t;
const int M = ;
int head[M],tot;
struct Edge{
int from,to,cap,flow,Next,w;
Edge(){}
Edge(int f,int to,int cap,int Next,int w):from(f),to(to),cap(cap),Next(Next),w(w),flow(){}
}e[M<<];
inline void ins(int u,int v,int w,int cap)
{
e[++tot] = Edge{u,v,cap,head[u],w};
head[u] = tot;
}
int d[],pre[],inq[],a[];
bool spfa()
{
MSi(d);MS0(inq);
d[s] = ;
queue<int> q;
q.push(s);
inq[s] = ;pre[s] = ;a[s] = inf;
while(!q.empty()){
int u = q.front();q.pop();
inq[u] = ;
for(int id = head[u];id; id = e[id].Next){
int v = e[id].to;
if(d[v] > d[u] + e[id].w && e[id].cap > e[id].flow){
d[v] = d[u] + e[id].w;
pre[v] = id;
a[v] = min(a[u],e[id].cap - e[id].flow);
if(!inq[v]){ q.push(v); inq[v] = ;}
}
}
}
return d[t] != inf;
}
void solve()
{
ll ans = ;
while(spfa()){
ans += d[t]*a[t];
for(int u = t;u != s;u = e[pre[u]].from){
e[pre[u]].flow += a[t];
e[pre[u]^].flow -= a[t];
}
}
printf("%I64d\n",ans);
}
int main()
{
while(scanf("%d%d",&n,&m) == ){
MS0(head);tot = ;
s = ,t = n+;
int u,v,w;
rep0(i,,m){
read3(u,v,w);
ins(u,v,w,);ins(v,u,-w,);// ** 下面不能省略,因为是无向输入的.
ins(v,u,w,);ins(u,v,-w,);
}
ins(s,,,);ins(,s,,);
ins(n,t,,);ins(t,n,,);
solve();
}
return ;
}

poj 2135 Farm Tour 最小费用最大流建图跑最短路的更多相关文章

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

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

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

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

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

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

  4. poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙

    /** 题目:poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙 链接:http://poj.org/problem?id=3680 题意:给定n个区间,每个区间(ai,bi ...

  5. hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙

    /** 题目:hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4106 ...

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

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

  7. 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 ...

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

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

  9. LibreOJ #6008. 「网络流 24 题」餐巾计划 最小费用最大流 建图

    #6008. 「网络流 24 题」餐巾计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

随机推荐

  1. android的界面编程

    主要是用View以及ViewGroup,同时ViewGroup又是View的子类,充当容器. 主要有两种方法控制view的行为: 1.在XML布局文件中通过XML属性进行控制 2.在Java代码中通过 ...

  2. 将WSDL文件生成的Java文件

  3. javaBean为什么要实现Serializable接口?

    引用:http://jzinfo.javaeye.com/blog/519470 Java的"对象序列化"能让你将一个实现了Serializable接口的对象转换成一组byte,这 ...

  4. windows下mysql初始密码设置

    转载自:http://blog.csdn.net/ofreelander/article/details/50802780 1.my-default.ini 改名my.ini 在解压的目录下面复制my ...

  5. 马上搞定Android平台的Wi-Fi Direct开发

    导语 移动互联网时代,很多用户趋向于将大量的资料保存在移动设备上.但在给用户带来便利的同时引发了一个新的问题——保存在移动设备上的资料该怎样共享出去?到了思考时间,普通青年这样想:折腾什么劲啊,直接用 ...

  6. multithread synchronization use mutex and semaphore

    #include <malloc.h> #include <pthread.h> #include <semaphore.h> struct job { /* Li ...

  7. 条件阻塞Condition的应用

    Condition的功能类似在传统线程技术中的Object.wait和Object.notity的功能.   例子:生产者与消费者 import java.util.Random; import ja ...

  8. 关于文件的复制(用InputStream和OutputStream)

    作业:将c盘的一个文本文件复制到d盘. 分析:复制原理:读取c盘文件中的数据,将这些数据写入到d盘当中,连读带写. /* * 需求:作业:将c盘的一个文本文件复制到d盘. * 思路: * 1,需要读取 ...

  9. JavaScript入门(8)

    一.什么是对象 JavaScript中的所有事物都是对象.如:字符串.数值.数组.函数等.每个对象带有属性和方法. 对象的属性:反映该对象某些特定的性质的.如:字符串的长度.图像的长宽 对象的方法:能 ...

  10. dedecms 知识点总结

    生成-更新主页html 将自定义字段在arclist调用:   内容模型管理==>频道模型管理==>增加新字段==>列表处理:  使字段可以在列表的底层模板中获得(自定义字段默认仅能 ...