题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1143

首先用传递闭包,知道一个点是否可以到达另一个点,即mp[i][j]==1表示i可以到j;mp[i][j]==0表示i不可以到j。
然后变成求有向无环图的最大独立集。
这是个经典问题,要变成二分图。
将每个点拆成两个点x和y
如果有边i->j,那么连边ix->jy。
然后求二分图的最大匹配,N-最大匹配就是答案。
  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<iostream>
  4. #include<fstream>
  5. #include<algorithm>
  6. #include<cstring>
  7. #include<string>
  8. #include<cmath>
  9. #include<queue>
  10. #include<stack>
  11. #include<map>
  12. #include<utility>
  13. #include<set>
  14. #include<bitset>
  15. #include<vector>
  16. #include<functional>
  17. #include<deque>
  18. #include<cctype>
  19. #include<climits>
  20. #include<complex>
  21. //#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj
  22.  
  23. using namespace std;
  24.  
  25. typedef long long LL;
  26. typedef double DB;
  27. typedef pair<int,int> PII;
  28. typedef complex<DB> CP;
  29.  
  30. #define mmst(a,v) memset(a,v,sizeof(a))
  31. #define mmcy(a,b) memcpy(a,b,sizeof(a))
  32. #define re(i,a,b) for(i=a;i<=b;i++)
  33. #define red(i,a,b) for(i=a;i>=b;i--)
  34. #define fi first
  35. #define se second
  36. #define m_p(a,b) make_pair(a,b)
  37. #define SF scanf
  38. #define PF printf
  39. #define two(k) (1<<(k))
  40.  
  41. template<class T>inline T sqr(T x){return x*x;}
  42. template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
  43. template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;}
  44.  
  45. const DB EPS=1e-;
  46. inline int sgn(DB x){if(abs(x)<EPS)return ;return(x>)?:-;}
  47. const DB Pi=acos(-1.0);
  48.  
  49. inline int gint()
  50. {
  51. int res=;bool neg=;char z;
  52. for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
  53. if(z==EOF)return ;
  54. if(z=='-'){neg=;z=getchar();}
  55. for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
  56. return (neg)?-res:res;
  57. }
  58. inline LL gll()
  59. {
  60. LL res=;bool neg=;char z;
  61. for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
  62. if(z==EOF)return ;
  63. if(z=='-'){neg=;z=getchar();}
  64. for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
  65. return (neg)?-res:res;
  66. }
  67.  
  68. const int maxN=;
  69.  
  70. int N,M;
  71. int mp[maxN+][maxN+];
  72.  
  73. int first[maxN+],now;
  74. struct Tedge{int v,next;}edge[maxN*maxN+];
  75. int ans;
  76.  
  77. inline void addedge(int u,int v)
  78. {
  79. now++;
  80. edge[now].v=v;
  81. edge[now].next=first[u];
  82. first[u]=now;
  83. }
  84.  
  85. int vis[maxN+];
  86. int form[maxN+];
  87.  
  88. inline int DFS(int u)
  89. {
  90. int i,v;
  91. vis[u]=;
  92. for(i=first[u],v=edge[i].v;i!=-;i=edge[i].next,v=edge[i].v)
  93. if(!form[v] || (!vis[form[v]] && DFS(form[v])))
  94. {
  95. form[v]=u;
  96. return ;
  97. }
  98. return ;
  99. }
  100.  
  101. int main()
  102. {
  103. freopen("bzoj1143.in","r",stdin);
  104. freopen("bzoj1143.out","w",stdout);
  105. int i,j,k;
  106. N=gint();M=gint();
  107. re(i,,M){int u=gint(),v=gint();mp[u][v]=;}
  108. re(k,,N)re(i,,N)re(j,,N)if(i!=k && j!=k && i!=j && mp[i][k] && mp[k][j]) mp[i][j]=;
  109. mmst(first,-);now=-;
  110. re(i,,N)re(j,,N)if(mp[i][j])addedge(i,j);
  111. ans=;
  112. re(i,,N)
  113. {
  114. re(j,,N)vis[j]=;
  115. ans+=DFS(i);
  116. }
  117. printf("%d\n",N-ans);
  118. return ;
  119. }

bzoj1143的更多相关文章

  1. BZOJ1143 [CTSC2008]祭祀river 二分图匹配 最小链覆盖

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1143 题意概括 给出一个有向图.求最小链覆盖. 题解 首先说两个概念: 链:一条链是一些点的集合, ...

  2. 【BZOJ1143】祭祀(网络流)

    [BZOJ1143]祭祀(网络流) 题面 BZOJ 洛谷 Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都 会在水面上举办盛大 ...

  3. [BZOJ1143][CTSC2008]祭祀river(Dilworth定理+二分图匹配)

    题意:给你一张n个点的DAG,最大化选择的点数,是点之间两两不可达. 要从Dilworth定理说起. Dilworth定理是定义在偏序集上的,也可以从图论的角度解释.偏序集中两个元素能比较大小,则在图 ...

  4. [BZOJ1143][CTSC2008]祭祀river(最长反链)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1143 分析: 最长反链==最小路径覆盖==n-二分图最大匹配数 某神犇对二分图的总结: ...

  5. BZOJ-1143&&BZOJ-2718 祭祀river&&毕业旅行 最长反链(Floyed传递闭包+二分图匹配)

    蛋蛋安利的双倍经验题 1143: [CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1901 Solved: 951 ...

  6. BZOJ1143 [CTSC2008] 祭祀river

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1143 题目大意: 给你n个点,点与点之间由有向边相连.如果u能到达v的话,那么他们就不能同 ...

  7. bzoj1143 2718

    最小可相交路径覆盖 先预处理可到达的点然后转化为最小不相交路径覆盖 type node=record        point,next:longint;      end; ..] of node; ...

  8. bzoj1143 祭祀river(最大独立集)

    [CTSC2008]祭祀river Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2175  Solved: 1098[Submit][Status] ...

  9. [bzoj1143][CTSC2008]祭祀

    题意:给定一个n个点m条边的有向无环图,你要选出最多的点,并且满足任意两点之间都不存在通路.2)输出每个点选了它之后还是否有最优解.   n<=100 m<=1000 题解:每个点拆两个点 ...

随机推荐

  1. RSA实例破解

    Description: Decode the message. You intercept the following message, which you know has been encode ...

  2. css中margin:0 auto没作用

    很多初学制作网页的朋友,可能会遇到的一个常见问题,就是在CSS中加了margin:0 auto;却没有效果,不能居中的问题!margin:0 auto;的意思就是:上下边界为0,左右根据宽度自适应!其 ...

  3. 【更新日志】售后CP更新日志

    记录一下: [售后CP更新日志] ============================================ 更新时间:[-- :] 更新内容: .版本升级,框架升级,框架升级版本3. ...

  4. php中定界符<<<的用法

    定界符给字符串定界的方法使用定界符语法(“<<<”).应该在 <<< 之后提供一个标识符,然后是字符串,然后是同样的标识符结束字符串. 结束标识符必须从行的第一列开 ...

  5. 解决svn状态图标不显示的办法

    SVN是一款出色的代码版本控制工具,大部分开发者都在使用.由于前不久刚做了系统,所以要重装一下SVN,结果就出了问题,问题就是,不管是文件处于什么状态他的提示图标都不显示,这就太不给力了吧.通过搜寻, ...

  6. Python-elementTree方法解析xml文件-01

    [XML基本概念介绍] XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据.概念一: <foo> # foo元素的起始标签 ...

  7. 《第一行代码》学习笔记35-服务Service(2)

    1.Android的UI线程不安全,想要更新应用程序里的UI元素,则须在主线程中进行,否则会出现异常. 2.Android不允许在子线程里进行UI操作,对于该情况,Android提供了一套异步消息处理 ...

  8. ViewPager欢迎页

    布局  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:to ...

  9. PullToRefresh的使用

    主界面↓ package com.wangzhen.pulltorefresh; import java.util.ArrayList; import java.util.List; import c ...

  10. arcmap从excel坐标数据生成点shp文件

    概述 今天试图在ArcMap中将excel数据转成点文件,在"Display XY Data"的时候,无法选择X,Y字段,很是纳闷,原来Excel中列的格式是文本,导致无法选择.有 ...