题目链接

题意:无向图有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. error: /usr/include/objc/objc-class.h: No such file or directory

    When i use the example of ShareKit package,i have come across this error:"error: /usr/include/o ...

  2. unix 网路编程(卷一)第一个程序编译过程

    unix卷一去年暑假买的到现在才开始看无比惭愧,而且惭愧第一个程序就断断续续弄了几天,要好好写程序了,马上要找工作了,下面介绍下把本书第一个程序跑起来的过程: 搜各种博客 我用系统的是ubuntu 1 ...

  3. android离线安装adt

    打开Eclipse, 在菜单栏上选择help->Install New SoftWare 出现如下界面: 点击 Add按钮,出现如下界面 在Name这而随意输入一个名字:ADT15:点击打开Ar ...

  4. win7如何共享文件 图文教你设置win7文件共享

    点评:win7文件共享已成为网友们之间的热议,接下来为大家分享下如何共享文件,首先开启guest账户( 开始菜单 → 运行 → services.msc → 双击 server 服务项 ,设置启动类型 ...

  5. MySql添加用户,新建数据库,用户授权,删除用户,修改密码

    转自:http://www.cnblogs.com/fly1988happy/archive/2011/12/15/2288554.html MySql中添加用户,新建数据库,用户授权,删除用户,修改 ...

  6. CSS——伪元素与伪类

    伪类与伪元素 伪类:在特殊性中占据0,0,1,0 :link 向未访问的链接添加特殊的样式.也就是说,链接所指的 URI 尚未出现在用户代理的历史中.这种状态与 :visited状态是互斥的. :vi ...

  7. mvn打包

    mvn install -DskipTests mvn install -Dmaven.test.skip=true

  8. Cookie的属性(cookie的设置、获取和删除)

    每个cookie都有四个可选的属性,他们分别控制cookie的生存周期.可见性.安全性等. Cookies最初设计时,是为了CGI编程.但是,我们也可以使用Javascript脚本来操纵cookies ...

  9. Linux下mplayer源代码安装方法

    http://www.linuxidc.com/Linux/2007-08/6820.htm 1下载安装mplayer需要的各种软件 去这里下载http://www.mplayerhq.hu/MPla ...

  10. 电脑小白学习软件开发-C#语言基础之循环重点讲解,习题

    写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用视频. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是不在话下. 本教程是基础教程,适合任何有志于学习软件开发的 ...