Problem, in short Given a weighed, undirected graph, find the shortest path from S to T and back without using the same edge twice.

很基础的费用网络流

 #include<iostream>
 #include<cstdio>
 #include<cstring>
 #include<queue>
 #include<vector>
 #define LL long long
 #define maxn 1024
 using namespace std;
 <<;
 struct Edge{
     int from,to,dist,flow,cap;
 };
 int n,m,d[maxn],a[maxn],inq[maxn],p[maxn];
 vector<Edge> edges;
 vector<int> G[maxn];
 void addEdge(int from,int to,int dist){
     edges.push_back((Edge){,});
     edges.push_back((Edge){to,,});
     int m=edges.size();
     G[);
     G[to].push_back(m-);
 }
 void connect(){
     edges.push_back((Edge){,n+,,,});
     edges.push_back((Edge){n+,,,,});
     int m=edges.size();
     G[].push_back(m-);
     G[n+].push_back(m-);
     edges.push_back((Edge){n+,,,,});
     edges.push_back((Edge){,n+,,,});
     m+=;
     G[n+].push_back(m-);
     G[].push_back(m-);
     edges.push_back((Edge){n,n+,,,});
     edges.push_back((Edge){n+,n,,,});
     m+=;
     G[n].push_back(m-);
     G[n+].push_back(m-);
     edges.push_back((Edge){n+,n,,,});
     edges.push_back((Edge){n,n+,,,});
     m+=;
     G[n+].push_back(m-);
     G[n].push_back(m-);
 }
 bool BF(int s,int t,int &flow,int &cost){
     memset(inq,,sizeof(inq));
     ;i<=n+;i++) d[i]=inf;
     inq[s]=;d[s]=;a[s]=inf;
     queue<int> Q;
     Q.push(s);
     while(!Q.empty()){
         int u=Q.front();Q.pop();
         inq[u]=;
         ;i<G[u].size();i++){
             Edge &e=edges[G[u][i]];
             if(e.cap>e.flow&&d[e.to]>d[u]+e.dist){
                 d[e.to]=d[u]+e.dist;
                 a[e.to]=min(a[u],e.cap-e.flow);
                 p[e.to]=G[u][i];
                 if(!inq[e.to]){
                     inq[e.to]=;
                     Q.push(e.to);
                 }
             }
         }
     }
     if(d[t]>=inf) return false;
     flow+=a[t];
     cost+=a[t]*d[t];
     int u=t;
     for(;u!=s;u=edges[p[u]].from){
         edges[p[u]].flow+=a[t];
         edges[p[u]^].flow-=a[t];
     }
     return true;
 }
 void init(){
     edges.clear();
     ;i<=n+;i++) G[i].clear();
 }
 int main()
 {
     while(scanf("%d",&n)&&n){
         scanf("%d",&m);
         init();
         int x,y,d;
         ;i<=m;i++){
             scanf("%d%d%d",&x,&y,&d);
             addEdge(x,y,d);addEdge(y,x,d);
         }
         connect();
         ,cost=;
         ,n+,flow,cost));
         ){
             puts("Back to jail");
         }else{
             printf("%d\n",cost);
         }
     }
     ;
 }

UVa10806 Dijkstra,Dijkstra-费用网络流的更多相关文章

  1. UVa 10806 Dijkstra,Dijkstra(最小费用最大流)

    裸的费用流.往返就相当于从起点走两条路到终点. 按题意建图,将距离设为费用,流量设为1.然后增加2个点,一个连向节点1,流量=2,费用=0;结点n连一条同样的弧,然后求解最小费用最大流.当且仅当最大流 ...

  2. HDU 6611 K Subsequence(Dijkstra优化费用流 模板)题解

    题意: 有\(n\)个数\(a_1\cdots a_n\),现要你给出\(k\)个不相交的非降子序列,使得和最大. 思路: 费用流建图,每个点拆点,费用为\(-a[i]\),然后和源点连边,和后面非降 ...

  3. uva 10806 Dijkstra, Dijkstra. (最小费最大流)

    uva 10806 Dijkstra, Dijkstra. 题目大意:你和你的伙伴想要越狱.你的伙伴先去探路,等你的伙伴到火车站后,他会打电话给你(电话是藏在蛋糕里带进来的),然后你就能够跑去火车站了 ...

  4. 【最小费用最大流模板】【Uva10806+Spring Team PK】Dijkstra, Dijkstra,

    题意:从1到n 再从n到1 不经过重复的边 ,(如果是点就是旅行商问题了),问最短路 建立一个超级源S S到1连一条费用为0,容量为2的边,求费用流即可 如果流<2 那么hehe 否则    输 ...

  5. UVA-10806 Dijkstra, Dijkstra. (最小费用流,网络流建模)

    题目大意:给一张带权简单图,找出一条经过起点s和终点t的最小回路. 题目分析:建立网络,以s为源点,t为汇点,另每条边的容量为1,单位费用为边权值.求最小费用流,增广两次后的最小费用便是答案. 代码如 ...

  6. dijkstra 最小费用最大流

    前言:众所周知:spfa他死了 滑稽 dijkstra同样为最短路算法,为什么不能跑费用流qwq 好像是因为有负权边的缘故 但是如果我们如果使用某种玄学的将边权都拉回到正数的话 就可以跑了dijkst ...

  7. UVA 10806 Dijkstra, Dijkstra.(费用流)

    n个点的无向带权图,求1->n的最短往返路径,不走重复边. 这里涉及到一个知识点:求无向图上s->t的最短路,其实就是费用流. 而求1->n最短往返路径呢?增加源点s,由s到1加弧, ...

  8. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  9. UVA 10806 Dijkstra, Dijkstra.

    题意: 从起点走到终点,然后从终点走到起点,其中不能同时走过相同的一条边,问你最小路径长度.先输入终点n,起点为1,接下来输入m,代表有m条边.每条边由起点,终点,长度组成. 分析: 求最小长度,还限 ...

随机推荐

  1. SQL2008无法启动,报错"17051

    解决办法: 第一步:进入SQL2008配置工具中的安装中心, 第二步:再进入维护界面,选择版本升级, 第三步:进入产品密钥,输入密钥 Developer: PTTFM-X467G-P7RH2-3Q6C ...

  2. php大力力 [039节] 修改一下后台项目,同时启用印象笔记,要做的事情todo列表,记录在印象笔记,速度快一些

    php大力力 [039节]  修改一下后台项目,同时启用印象笔记,要做的事情todo列表,记录在印象笔记,速度快一些

  3. 使用Template控制Editor显示方式

    @Html.EditorFor可以由Template决定显示 虽然都是EditorFor,页面上显示却不同,ReleaseDate是一个Jquery DatePicker: 怎么实现的呢?就是Temp ...

  4. iOS运行时与method swizzling

    C语言是静态语言,它的工作方式是通过函数调用,这样在编译时我们就已经确定程序如何运行的.而Objective-C是动态语言,它并非通过调用类的方 法来执行功能,而是给对象发送消息,对象在接收到消息之后 ...

  5. Spark SQL Thrift Server 配置 Kerberos身份认证和权限管理

    转载请注明出处:http://www.cnblogs.com/xiaodf/ 之前的博客介绍了通过Kerberos + Sentry的方式实现了hive server2的身份认证和权限管理功能,本文主 ...

  6. Ingress qdisc

    Ingress qdisc All qdiscs discussed so far are egress qdiscs. Each interface however can also have an ...

  7. Spring源码学习之:@async 方法上添加该注解实现异步调用的原理

    在我们使用spring框架的过程中,在很多时候我们会使用@async注解来异步执行某一些方法,提高系统的执行效率.今天我们来探讨下 spring 是如何完成这个功能的.    spring 在扫描be ...

  8. .net framework 4.0 从 GAC 卸载 程序集

    .net framework 4.0 的 GAC 目录: C:\Windows\Microsoft.NET\assembly\GAC_MSIL 要卸载,仍然使用 gacutil 命令,不要带扩展名: ...

  9. Vmware vsphere webservice sdk 连接打开慢的问题

    还在为VimService实例化速度慢的问题烦恼吗?这有一篇文章可以帮你解决问题,英文水平所限,就不翻译了,原文地址http://kb.vmware.com/selfservice/microsite ...

  10. 【linux】三十分钟学会AWK

    本文大部分内容翻译自我开始学习AWK时看到的一篇英文文章 AWK Tutorial ,觉得对AWK入门非常有帮助,所以对其进行了粗略的翻译,并对其中部分内容进行了删减或者补充,希望能为对AWK感兴趣的 ...