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 + ;
  20. const int maxm = 2e4 + ;
  21. const int inf = 0x3f3f3f3f;
  22.  
  23. struct MCMF {
  24. struct Edge {
  25. int v, c, w, next;
  26. }p[maxm << ];
  27. int e, head[maxn], dis[maxn], pre[maxn], cnt[maxn], sumFlow, n;
  28. bool vis[maxn];
  29. void init(int nt){
  30. e = , n = nt + ;
  31. memset(head, -, sizeof(head[]) * (n + ));
  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 = ; 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 = ; i <= n; ++i)
  41. vis[i] = cnt[i] = , pre[i] = -, dis[i] = inf;
  42. vis[S] = ; dis[S] = ;
  43. q.push(S);
  44. while (!q.empty()){
  45. int u = q.front(); q.pop();
  46. vis[u] = ;
  47. for (int i = head[u]; i + ; 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] = ;
  55. if (++cnt[v] > n) return ;
  56. }
  57. }
  58. }
  59. }
  60. return dis[T] != inf;
  61. }
  62. int mcmf(int S, int T){
  63. sumFlow = ;
  64. int minFlow = , minCost = ;
  65. while (spfa(S, T)){
  66. minFlow = inf + ;
  67. for (int i = pre[T]; i + ; i = pre[ p[i ^ ].v ])
  68. minFlow = min(minFlow, p[i].c);
  69. sumFlow += minFlow;
  70. for (int i = pre[T]; i + ; i = pre[ p[i ^ ].v ]){
  71. p[i].c -= minFlow;
  72. p[i ^ ].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, , sizeof(ind));
  82. memset(outd, , sizeof(outd));
  83. ans = ;
  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 = ; i <= nt; ++i){
  93. if (ind[i] == || outd[i] == ) return false;
  94. }
  95. for (int i = ; i <= nt; ++i){
  96. if (ind[i] - outd[i] > )
  97. addEdge(, i, ind[i] - outd[i], );
  98. else if (ind[i] - outd[i] < )
  99. addEdge(i, n, outd[i] - ind[i], );
  100. }
  101. return true;
  102. }
  103. void solve(){
  104. ans += mcmf(, 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 ;
  120. }

hoj 2739 中国邮局问题的更多相关文章

  1. Soj题目分类

    -----------------------------最优化问题------------------------------------- ----------------------常规动态规划 ...

  2. HIT 2739 - The Chinese Postman Problem - [带权有向图上的中国邮路问题][最小费用最大流]

    题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2739 Time limit : 1 sec Memory limit : 64 M A Chinese ...

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

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

  4. Oschat IM 开源即时通讯项目介绍 - FengJ的个人页面 - 开源中国社区

    Oschat IM 开源即时通讯项目介绍 - FengJ的个人页面 - 开源中国社区 Oschat IM 开源即时通讯项目介绍    255人收藏此文章, 我要收藏 发表于5天前(2013-08-28 ...

  5. 一起学微软Power BI系列-使用技巧(4)Power BI中国版企业环境搭建和帐号问题

    千呼万唤的Power BI中国版终于落地了,相信12月初的微软技术大会之后已经铺天盖地的新闻出现了,不错,Power BI中国版真的来了,但还有些遗憾,国际版的一些重量级服务如power bi emb ...

  6. Highcharts中国地图热力图

    最近有个项目需要将MC销量按大陆各省统计,并以中国地图人力图效果显示.由于项目一直使用Highcharts进行图表的统计,故采用Highmaps来实现. 效果如下: 1)中国各个省.直辖市.自治区: ...

  7. 中国CIO最关心的八大问题(下)

    中国CIO最关心的八大问题(下) 从调研数据还可以看出,在企业级IT建设与投资上,CIO们并非是一群狂热的技术信徒,他们更多的是从企业发展阶段.信息化程度.技术成熟度.ROI等方面进行综合评估. 五. ...

  8. 中国CIO最关心的八大问题(上)

    中国CIO最关心的八大问题(上) 近期,ITValue和ValueResearch联合展开<IT决策者投资与生存状态大调查>,调查范围从关注CIO本身,延展至关注CIO所供职企业--其赖以 ...

  9. 从国内流程管理软件市场份额看中国BPM行业发展

    随着互联网+.中国制造2025.工业4.0等国家战略的支持与引导,企业在数字经济时代的信息化表现惊人,越来越多企业认识到,对于企业的发展来说,信息自动化远远还不够,企业的战略.业务和IT之间需保持高度 ...

随机推荐

  1. C# 解决窗体假死的状态

    异步调用是CLR为开发者提供的一种重要的编程手段,它也是构建高性能.可伸缩应用程序的关键.在多核CPU越来越普及的今天,异步编程允许使用非常少的线程执行很多操作.我们通常使用异步完成许多计算型.IO型 ...

  2. ColorSchemer Studio 2 破解

    软件介绍: ColorSchemer Studio 2 is a professional color matching application for anyone from hobbyists t ...

  3. Linux Ubuntu 开机自动启动项设置方法 例:svn服务

    在init.d目录建立一个脚本文件svnd.sh # cd /etc/init.d # vim svnd.sh 输入svnd.sh内容如下(/kaifa/svn 为svn仓库目录): #!/bin/b ...

  4. iOS学习笔记23-音效与音乐

    一.音频 在iOS中,音频播放从形式上能够分为音效播放和音乐播放. * 音效: * 主要指一些短音频的播放,这类音频一般不须要进行进度.循环等控制. * 在iOS中.音效我们是使用AudioToolb ...

  5. NSight统计数据的颜色,缩写意义是什么?来自NV Jeff Kiel 比较官方的解释!

    结合这个图示来看:https://dl.dropboxusercontent.com/u/32077444/nsight.pdf 1) The bars you see in the Summary ...

  6. 解决window10系统电脑插入耳机之后没有声音的问题

    其实办法也是从百度百科上查到的 ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄     可能是因为自己某个不小心的操作更改了设置 1. 首先要点开设置按钮,在搜索栏输入控制面板 (当然知道控制面板在哪里的小伙伴就不用 ...

  7. Mysql命令行备份与还原数据库操作实例

    无论是Windows还是Linux,都可以通过如下命令行形式备份Mysql数据库 备份命令: 在windows的DOS窗口命令行或linux的shell命令行,假设需要备份的数据库是advanced: ...

  8. 在连接mysql数据库时出错:The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone

    这个错误是时区导致的,所以需要在配置连接url后面加上时区: url=jdbc:mysql://localhost:3309/test?serverTimezone=UTC 其中UTC是统一标准世界时 ...

  9. mysql 函数substring_index() 截取字符串

    函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例:select left(content,200) as abstract from my ...

  10. 调整Redmine的用户显示格式

    在 Redmine 中新建用户时是酱紫的: 必须指定姓氏.名字.然后 Redmine 默认是按"名字 姓氏"这样的方式显示用户.比方"张三",会显示成" ...