http://acm.hdu.edu.cn/showproblem.php?pid=3488

原来写过的一道题,今天重新看费用流又做了一遍

题意:给一个图,求环的并(权值和最小)

思路:每个点只能走一次,且都要走,所以一个点的出度入度均为1,因此拆点建图跑二分图最优匹配

用费用流写的,速度比km慢

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <queue>
  5. using namespace std ;
  6. const int INF=0xfffffff ;
  7. struct node{
  8. int s,t,cap,cost,nxt ;
  9. }e[] ;
  10. int sumflow ;
  11. int n,m,cnt,head[],vis[],dis[],pre[] ;
  12. void add(int s,int t,int cap,int cost)
  13. {
  14. e[cnt].s=s ;e[cnt].t=t ;e[cnt].cap=cap ;e[cnt].cost=cost ;e[cnt].nxt=head[s] ;head[s]=cnt++ ;
  15. e[cnt].s=t ;e[cnt].t=s ;e[cnt].cap= ;e[cnt].cost=-cost ;e[cnt].nxt=head[t] ;head[t]=cnt++ ;
  16. }
  17. int spfa(int s,int t,int N)
  18. {
  19. for(int i= ;i<=N ;i++)
  20. dis[i]=INF ;
  21. dis[s]= ;
  22. memset(vis,,sizeof(vis)) ;
  23. memset(pre,-,sizeof(pre)) ;
  24. vis[s]= ;
  25. queue <int> q ;
  26. q.push(s) ;
  27. while(!q.empty())
  28. {
  29. int u=q.front() ;
  30. q.pop() ;
  31. vis[u]= ;
  32. for(int i=head[u] ;i!=- ;i=e[i].nxt)
  33. {
  34. int tt=e[i].t ;
  35. if(e[i].cap && dis[tt]>dis[u]+e[i].cost)
  36. {
  37. dis[tt]=dis[u]+e[i].cost ;
  38. pre[tt]=i ;
  39. if(!vis[tt])
  40. {
  41. vis[tt]= ;
  42. q.push(tt) ;
  43. }
  44. }
  45. }
  46. }
  47. if(dis[t]==INF)return ;
  48. return ;
  49. }
  50. int MCMF(int s,int t,int N)
  51. {
  52. int flow,minflow,mincost ;
  53. mincost=flow= ;
  54. while(spfa(s,t,N))
  55. {
  56. minflow=INF ;
  57. for(int i=pre[t] ;i!=- ;i=pre[e[i].s])
  58. minflow=min(minflow,e[i].cap) ;
  59. flow+=minflow ;
  60. for(int i=pre[t] ;i!=- ;i=pre[e[i].s])
  61. {
  62. e[i].cap-=minflow ;
  63. e[i^].cap+=minflow ;
  64. }
  65. mincost+=dis[t]*minflow ;
  66. }
  67. sumflow=flow ;//最大流
  68. return mincost ;
  69. }
  70. int main()
  71. {
  72. int t ;
  73. scanf("%d",&t) ;
  74. while(t--)
  75. {
  76. cnt= ;
  77. memset(head,-,sizeof(head)) ;
  78. scanf("%d%d",&n,&m) ;
  79. int ss= ;
  80. int st=*n+ ;
  81. for(int i= ;i<m ;i++)
  82. {
  83. int s,t,v ;
  84. scanf("%d%d%d",&s,&t,&v) ;
  85. add(s,t+n,,v) ;
  86. }
  87. for(int i= ;i<=n ;i++)
  88. add(,i,,) ;
  89. for(int i=n+ ;i<=*n ;i++)
  90. add(i,st,,) ;
  91. int ans=MCMF(ss,st,st+) ;
  92. printf("%d\n",ans) ;
  93. }
  94. return ;
  95. }

HDU 3488的更多相关文章

  1. Hdu 3488 Tour (KM 有向环覆盖)

    题目链接: Hdu 3488 Tour 题目描述: 有n个节点,m条有权单向路,要求用一个或者多个环覆盖所有的节点.每个节点只能出现在一个环中,每个环中至少有两个节点.问最小边权花费为多少? 解题思路 ...

  2. hdu 3488 Tour

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3488 题意:给你一个N个顶点M条边的带权有向图,要你把该图分成1个或多个不相交的有向环.且所有定点都只 ...

  3. Tour HDU - 3488 有向环最小权值覆盖 费用流

    http://acm.hdu.edu.cn/showproblem.php?pid=3488 给一个无源汇的,带有边权的有向图 让你找出一个最小的哈密顿回路 可以用KM算法写,但是费用流也行 思路 1 ...

  4. HDU 3488 Tour(最小费用流:有向环最小权值覆盖)

    http://acm.hdu.edu.cn/showproblem.php?pid=3488 题意: 给出n个点和m条边,每条边有距离,把这n个点分成1个或多个环,且每个点只能在一个环中,保证有解. ...

  5. hdu 3488(KM算法||最小费用最大流)

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  6. 图论(二分图,KM算法):HDU 3488 Tour

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  7. Q - Tour - hdu 3488(最小匹配值)

    题意:一个王国有N个城市,M条路,都是有向的,现在可以去旅游,不过走的路只能是环(至少也需要有两个城市),他们保证这些城市之间的路径都是有环构成的,现在至少需要走多少路. 分析:因为是有向图所以,而且 ...

  8. HDU 3488 Tour (最大权完美匹配)【KM算法】

    <题目链接> 题目大意:给出n个点m条单向边边以及经过每条边的费用,让你求出走过一个哈密顿环(除起点外,每个点只能走一次)的最小费用.题目保证至少存在一个环满足条件. 解题分析: 因为要求 ...

  9. Tour HDU - 3488(最大权值匹配)

    Tour In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 30000) one- ...

随机推荐

  1. Codeforces Round #303 (Div. 2)E. Paths and Trees 最短路

    E. Paths and Trees time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  2. sqlserver 存入DB中的中文乱码

    在war包中的appliation.properties中,配置的数据库连接做了修改,也不知道当初为什么这么改 导致存入DB中的中文是??? testaaa.jdbc.type=mssqltestaa ...

  3. BeyondCompare

    BeyondCompare可对文本,照片,文件夹,注册表等等进行比较 在git看不清楚版本和改动项的时候,直接将生产上的包拉下来和即将发布的包,作对比.

  4. preg_match

    $baseUrl = request()->baseUrl(); if (!preg_match('/admin.php/',$baseUrl)) { $this->redirect('/ ...

  5. Python day7_set集合的常用方法以及常用格式化的总结

    1.集合的定义:集合是无序的,没有重合元素的集合 集合外使用{}符号,各元素用,连接 2.集合的常用方法 1.add增加元素 2.clear清除元素 3.copy浅拷贝 4.difference差集( ...

  6. 《Blue_Flke》 团队项目用户验收评审

    一.beta冲刺 beta冲刺第一.二天:https://www.cnblogs.com/ruanjgc/p/9226434.html beta冲刺第三天:https://www.cnblogs.co ...

  7. 会话技术及jsp概述

    一.会话技术 1.概念:在一次会话中共享数据,在web中指,浏览器和服务器的一次通信.包含多次请求,和多次响应. 可以在一次会话的多次请求中共享数据. 2.客户端会话技术:Cookie 将数据保存在客 ...

  8. Python -- Scrapy 框架简单介绍(Scrapy 安装及项目创建)

    Python -- Scrapy 框架简单介绍 最近在学习python 爬虫,先后了解学习urllib.urllib2.requests等,后来发现爬虫也有很多框架,而推荐学习最多就是Scrapy框架 ...

  9. android--------WebView实现 Html5 视频标签加载

    自Android 4.4起,Android中的WebView开始基于Chromium(谷歌浏览器)支持浏览器的一系列功能,webkit解析网页各个节点,这个改变,使得WebView的性能大幅度提升,并 ...

  10. C++&C#外挂(内存修改)

    大学时候因为主修C#语言(当然现在做的是javaweb开发),那时在网上学了用C#做外挂的教程,外挂嘛,大家都懂的.这里只是低级的修改内存,不涉及到截获数据包.如果是欺骗服务器,修改服务器数据,那就难 ...