1 /*若原图的基图不连通,
  2 或者存在某个点的入度或出度为 0 则无解。
  3 统计所有点的入度出度之差 Di, 对于 Di > 0 的点,
  4 加边(s, i, Di, 0); 对于 Di < 0 的点加边(i, t, -Di,0);
  5 对原图中的每条边(i, j),
  6 在网络中加边(i, j, ∞, Dij),Dij 为边(i, j)的权值。
  7 求一次最小费用流,费用加上原图所有边权和即为结果。
  8 若进一步要求输出最小权值回路,则对所有流量 fij > 0 的边(i, j),在原图中复制fij 份,这样原图便成为欧拉图,求一次欧拉回路即可。
  9 */
 10 #include <iostream>
 11 #include <cstdio>
 12 #include <cstring>
 13 #include <queue>
 14 #include <algorithm>
 15 #include <cmath>
 16
 17 using namespace std;
 18
 19 const int maxn = 1e2 + 5;
 20 const int maxm = 2e4 + 5;
 21 const int inf = 0x3f3f3f3f;
 22
 23 struct MCMF {
 24     struct Edge {
 25         int v, c, w, next;
 26     }p[maxm << 1];
 27     int e, head[maxn], dis[maxn], pre[maxn], cnt[maxn], sumFlow, n;
 28     bool vis[maxn];
 29     void init(int nt){
 30         e = 0, n = nt + 1;
 31         memset(head, -1, sizeof(head[0]) * (n + 2));
 32     }
 33     void addEdge(int u, int v, int c, int w){
 34         p[e].v = v; p[e].c = c; p[e].w = w; p[e].next = head[u]; head[u] = e++;
 35         swap(u, v);
 36         p[e].v = v; p[e].c = 0; p[e].w = -w; p[e].next = head[u]; head[u] = e++;
 37     }
 38     bool spfa(int S, int T){
 39         queue <int> q;
 40         for (int i = 0; i <= n; ++i)
 41             vis[i] = cnt[i] = 0, pre[i] = -1, dis[i] = inf;
 42         vis[S] = 1; dis[S] = 0;
 43         q.push(S);
 44         while (!q.empty()){
 45             int u = q.front(); q.pop();
 46             vis[u] = 0;
 47             for (int i = head[u]; i + 1; i = p[i].next){
 48                 int v = p[i].v;
 49                 if (p[i].c && dis[v] > dis[u] + p[i].w){
 50                     dis[v] = dis[u] + p[i].w;
 51                     pre[v] = i;
 52                     if (!vis[v]){
 53                         q.push(v);
 54                         vis[v] = 1;
 55                         if (++cnt[v] > n) return 0;
 56                     }
 57                 }
 58             }
 59         }
 60         return dis[T] != inf;
 61     }
 62     int mcmf(int S, int T){
 63         sumFlow = 0;
 64         int minFlow = 0, minCost = 0;
 65         while (spfa(S, T)){
 66             minFlow = inf + 1;
 67             for (int i = pre[T]; i + 1; i = pre[ p[i ^ 1].v ])
 68                 minFlow = min(minFlow, p[i].c);
 69             sumFlow += minFlow;
 70             for (int i = pre[T]; i + 1; i = pre[ p[i ^ 1].v ]){
 71                 p[i].c -= minFlow;
 72                 p[i ^ 1].c += minFlow;
 73             }
 74             minCost += dis[T] * minFlow;
 75         }
 76         return minCost;
 77     }
 78     int ind[maxn], outd[maxn], ans ;
 79     bool build(int nt, int mt){
 80         init(nt);
 81         memset(ind, 0, sizeof(ind));
 82         memset(outd, 0, sizeof(outd));
 83         ans = 0;
 84         int u, v, c;
 85         while (mt--){
 86             scanf("%d%d%d", &u, &v, &c);
 87             u++, v++;
 88             addEdge(u, v, inf, c);
 89             ans += c;
 90             outd[u]++, ind[v]++;
 91         }
 92         for (int i = 1; i <= nt; ++i){
 93             if (ind[i] == 0 || outd[i] == 0) return false;
 94         }
 95         for (int i = 1; i <= nt; ++i){
 96             if (ind[i] - outd[i] > 0)
 97                 addEdge(0, i, ind[i] - outd[i], 0);
 98             else if (ind[i] - outd[i] < 0)
 99                 addEdge(i, n, outd[i] - ind[i], 0);
100         }
101         return true;
102     }
103     void solve(){
104         ans += mcmf(0, n);
105         printf("%d\n", ans);
106     }
107 }my;
108 int main(){
109     int tcase, n, m;
110     scanf("%d", &tcase);
111     while (tcase--){
112         scanf("%d%d", &n, &m);
113         if (!my.build(n, m)){
114             printf("-1\n");
115             continue;
116         }
117         my.solve();
118     }
119     return 0;
120 }

转载于:https://www.cnblogs.com/Missa/p/3273552.html

hoj 2739 中国邮局问题相关推荐

  1. 四十岁重新创业 叫板中国邮局

    2000年互联网"泡沫"飞舞的时候,有一家看起来非常不错的网站在短短的一年时间里,经历了从"迅速 崛起-全线膨胀-急剧烧钱-大幅裁员-彻底垮台"的故事,这可能是 ...

  2. HOJ 2739 The Chinese Postman Problem 带权有向图上的中国邮路问题

    [题目大意]  带权有向图上的中国邮路问题:一名邮递员需要经过每条有向边至少一次,最后回到出发点,一条边多次经过权值要累加,问最小总权值是多少.(2 <= N <= 100, 1 < ...

  3. HOJ 2739 网络流【带权有向图上的中国邮路问题】

    [带权有向图上的中国邮路问题] #include<cstring> #include<cstdio> #include<algorithm> #include< ...

  4. [转载]清末烟台邮局旧影

    本文讲述的是清朝末年,在烟台出现的邮局,以及发行的明信片和邮票.当时,先后有日.德.俄.法.英几国在烟台设立过邮局...... 清末烟台邮局旧影 摘自<我爱烟台 > 主要作者:genpa ...

  5. 网络流建模汇总(转自Edelweiss)

    最大流 <POJ 1149    PIGS> [题目大意] 有 M 个猪圈,每个猪圈里初始时有若干头猪.一开始所有猪圈都是关闭的.依 次来了 N  个顾客,每个顾客分别会打开指定的几个猪圈 ...

  6. 日本转运海淘包裹被税、退运处理流程详解—北京篇

    http://mt.sohu.com/20151231/n434280446.shtml 俗话说:常在河边走,哪有不湿鞋.经常海淘的人难免会遇见包裹被海关查验而征税或退运的情况,但是由于目前海关.邮政 ...

  7. FXDD存取款,1-5工作日能够到国内个人银行账户

    2007-08-13 10:21:47 第一步,下载取款单,按照下图填写(下载样本). 第二步,把取款单扫描好发邮件到redemptions@fxddasia.com 或者传真到1.212.937.3 ...

  8. The Chinese Postman Problem HIT - 2739(有向图中国邮路问题)

    无向图的问题,如果每个点的度数为偶数,则就是欧拉回路,而对于一个点只有两种情况,奇数和偶数,那么就把都为奇数的一对点  连一条  边权为原图中这两点最短路的值  的边  是不是就好了 无向图中国邮路问 ...

  9. arcsoft panorama maker 6_葫芦娃 本领大——中国邮政将于2020年6月1日发行动画——葫芦兄弟特种邮票...

    葫芦娃  本领大 --中国邮政将于2020年6月1日发行<动画--葫芦兄弟>特种邮票 中国邮政将于2020年6月1日发行<动画--葫芦兄弟>特种邮票1套6枚.详情如下: 志号: ...

最新文章

  1. SAP QM初阶之事务代码CR05查询QM Work Center List
  2. K8s 集群节点在线率达到 99.9% 以上,扩容效率提升 50%,我们做了这 3 个深度改造
  3. 电子老鼠闯迷宫pascal解题程序
  4. 《Android UI基础教程》——1.2节Android 应用程序的基本结构
  5. 设计模式到底离我们有多远
  6. 苹果APPLE最新MI芯片笔记本安装第三方内核扩展
  7. LeetCode 663. 均匀树划分(树形DP)
  8. 第三季度营收不及预期 拼多多收盘跌超15%
  9. JavaScript的原型和原型链
  10. mysql主主复制半同步_mysql主从复制中的半同步复制
  11. jq实现百度图片移入移出内容提示框上下左右移动的效果
  12. 自动移动鼠标避免锁屏
  13. 软件开发流程——V模型
  14. 【VMware】vmware15 安装win10教程【史上最详细图文教程】
  15. 解决excel里面“取消隐藏”是灰色的问题
  16. 超级光棍节,你想好怎么过了吗?来聆听大师的演讲吧
  17. rgb转hsl,红绿蓝转色调饱和度亮度(颜色转换,c#)
  18. 2022最新大厂Java面试集合,五面拿下阿里飞猪offer
  19. 【瑞数5】浅谈某普期刊JS逆向的环境检测点
  20. 谷从何来,歌向何去——Google产品策略分析

热门文章

  1. 计算机408考研专题(建议收藏)
  2. Linux16.04配置CUDA8.0+CUDNNV5.1
  3. 汽车行业中的AUTOSAR与OSEK到底是什么,有什么区别
  4. gcc 4.4.2 安装
  5. 主成分分析和因子分析及其在R中的…
  6. 新版征信对信用卡养卡会有重大影响吗?
  7. 贷款被拒,因为你的手机有问题
  8. 旅美华人票友演绎易卜生话剧《玩偶之家》
  9. eureka集群只注册一个_Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇
  10. mysql 严格模式查看,如何查找和禁用MySQL严格模式?