题目大概说给一张有向图,每条边都有权值,要选若干条边使其形成若干个环且图上各个点都属于且只属于其中一个环,问选的边的最少权值和是多少。

各点出度=入度=1的图是若干个环,考虑用最小费用最大流:

  • 每个点拆成两点u和u'
  • 源点向u连容量1费用0的边,表示这个点的出度最多为1
  • u'向汇点连容量1费用0的边,表示这个点的入度最多为1
  • 对于原图上任何一条有向边<a,b,c>,a向b'连容量1费用c的边,选择这条边后a的出度+1,b的入度+1,费用+c

这样跑最小费用最大流,如果没满流就无解,否则MCMF就是最少权和。另外题目说2个点以上才能构成环,所以排除掉是自环的边就OK了,虽然不排除也能AC= =。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. #include<algorithm>
  5. using namespace std;
  6. #define INF (1<<30)
  7. #define MAXN 222
  8. #define MAXM 222*444
  9. struct Edge{
  10. int u,v,cap,cost,next;
  11. }edge[MAXM];
  12. int head[MAXN];
  13. int NV,NE,vs,vt;
  14.  
  15. void addEdge(int u,int v,int cap,int cost){
  16. edge[NE].u=u; edge[NE].v=v; edge[NE].cap=cap; edge[NE].cost=cost;
  17. edge[NE].next=head[u]; head[u]=NE++;
  18. edge[NE].u=v; edge[NE].v=u; edge[NE].cap=; edge[NE].cost=-cost;
  19. edge[NE].next=head[v]; head[v]=NE++;
  20. }
  21. bool vis[MAXN];
  22. int d[MAXN],pre[MAXN];
  23. bool SPFA(){
  24. for(int i=;i<NV;++i){
  25. vis[i]=;
  26. d[i]=INF;
  27. }
  28. vis[vs]=;
  29. d[vs]=;
  30. queue<int> que;
  31. que.push(vs);
  32. while(!que.empty()){
  33. int u=que.front(); que.pop();
  34. for(int i=head[u]; i!=-; i=edge[i].next){
  35. int v=edge[i].v;
  36. if(edge[i].cap && d[v]>d[u]+edge[i].cost){
  37. d[v]=d[u]+edge[i].cost;
  38. pre[v]=i;
  39. if(!vis[v]){
  40. vis[v]=;
  41. que.push(v);
  42. }
  43. }
  44. }
  45. vis[u]=;
  46. }
  47. return d[vt]!=INF;
  48. }
  49. int mxflow;
  50. int MCMF(){
  51. int res=;
  52. mxflow=;
  53. while(SPFA()){
  54. int flow=INF,cost=;
  55. for(int u=vt; u!=vs; u=edge[pre[u]].u){
  56. flow=min(flow,edge[pre[u]].cap);
  57. }
  58. mxflow+=flow;
  59. for(int u=vt; u!=vs; u=edge[pre[u]].u){
  60. edge[pre[u]].cap-=flow;
  61. edge[pre[u]^].cap+=flow;
  62. cost+=flow*edge[pre[u]].cost;
  63. }
  64. res+=cost;
  65. }
  66. return res;
  67. }
  68.  
  69. int main(){
  70. int n,m,a,b,c;
  71. while(~scanf("%d%d",&n,&m)){
  72. vs=; vt=n*+; NV=vt+; NE=;
  73. memset(head,-,sizeof(head));
  74. for(int i=; i<=n; ++i){
  75. addEdge(vs,i,,);
  76. addEdge(i+n,vt,,);
  77. }
  78. while(m--){
  79. scanf("%d%d%d",&a,&b,&c);
  80. if(a==b) continue;
  81. addEdge(a,b+n,,c);
  82. }
  83. mxflow=;
  84. int ans=MCMF();
  85. if(mxflow!=n) ans=-;
  86. printf("%d\n",ans);
  87. }
  88. return ;
  89. }

HDU1853 Cyclic Tour(最小费用最大流)的更多相关文章

  1. hdu 1853 Cyclic Tour 最小费用最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 There are N cities in our country, and M one-way ...

  2. 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 ...

  3. Farm Tour(最小费用最大流模板)

    Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18150   Accepted: 7023 Descri ...

  4. POJ2135 Farm Tour —— 最小费用最大流

    题目链接:http://poj.org/problem?id=2135 Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  5. poj 2351 Farm Tour (最小费用最大流)

    Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17230   Accepted: 6647 Descri ...

  6. poj 2135 Farm Tour 最小费用最大流建图跑最短路

    题目链接 题意:无向图有N(N <= 1000)个节点,M(M <= 10000)条边:从节点1走到节点N再从N走回来,图中不能走同一条边,且图中可能出现重边,问最短距离之和为多少? 思路 ...

  7. POJ 2135 Farm Tour [最小费用最大流]

    题意: 有n个点和m条边,让你从1出发到n再从n回到1,不要求所有点都要经过,但是每条边只能走一次.边是无向边. 问最短的行走距离多少. 一开始看这题还没搞费用流,后来搞了搞再回来看,想了想建图不是很 ...

  8. [poj] 1235 Farm Tour || 最小费用最大流

    原题 费用流板子题. 费用流与最大流的区别就是把bfs改为spfa,dfs时把按deep搜索改成按最短路搜索即可 #include<cstdio> #include<queue> ...

  9. hdu 1853 Cyclic Tour (二分匹配KM最小权值 或 最小费用最大流)

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

随机推荐

  1. javascript void运算符

    参考链接:http://www.cnblogs.com/ziyunfei/archive/2012/09/23/2698607.html语法: void expr 作用:计算表达式expr,并返回un ...

  2. 模拟赛1101d2

    幸运数字(number)Time Limit:1000ms Memory Limit:64MB题目描述LYK 最近运气很差,例如在 NOIP 初赛中仅仅考了 90 分,刚刚卡进复赛,于是它决定使用一些 ...

  3. Mysql基于GTIDs的复制

    通过GTIDs[global transaction identifiers],可以标识每一个事务,并且可以在其一旦提交追踪并应用于任何一个Slave上:这样 就不需要像BinaryLog复制依赖Lo ...

  4. iOS开发人员不容错过的10大工具

    内容简介 1.iOS简介 2.iOS开发十大实用工具之开发环境 3.iOS开发十大实用工具之图标设计 4.iOS开发十大实用工具之原型设计 5.iOS开发十大实用工具之演示工具 6.iOS开发十大实用 ...

  5. 【翻译十一】java-原子性操作

    Atomic Access In programming, an atomic action is one that effectively happens all at once. An atomi ...

  6. 【JAVA基本数据类型包装类】

    一.概述 JAVA中一共有8种数据类型,分别是byte short int long boolean float double  char,与此相对应的,有8个类与它们分别对应: byte Byte ...

  7. 用with实现python的threading,新鲜啊

    哈哈,2.5以后可用.自动加锁释放,如同操作文件打开关闭一样. #!/usr/bin/env python # -*- coding: utf-8 -*- import threading impor ...

  8. 【openGL】画圆

    #include "stdafx.h" #include <GL/glut.h> #include <stdlib.h> #include <math ...

  9. rhel7初体验

    Redhat7界面明显比之前的版本华丽了不少,貌似Redhat对普通用户的使用也要进行普及 可以在安装的同时修改root密码和创建新用户

  10. scala的tcp通信

    client: object ActorClient extends App { import actors.Actor, actors.remote.Node, actors.remote.Remo ...