Analysis

这道题因为我们要给能到达的两个点都连上,又由于n<=200,所以我们可以用n³的传递闭包来建边,再用匈牙利算法来求二分图最大点独立集。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 210
#define maxm 30010
using namespace std;
inline int read()
{
int x=;
bool f=;
char c=getchar();
for(; !isdigit(c); c=getchar()) if(c=='-') f=;
for(; isdigit(c); c=getchar()) x=(x<<)+(x<<)+c-'';
if(f) return x;
return -x;
}
inline void write(int x)
{
if(x<){putchar('-');x=-x;}
if(x>)write(x/);
putchar(x%+'');
}
int n,m,ans,match[maxm],cnt,tc[maxn][maxn];
bool book[maxm];
inline bool dfs(int u)
{
for(int i=;i<=n;i++)
{
if(tc[u][i]==)
{
if(!book[i])
{
book[i]=;
if(!match[i]||dfs(match[i]))
{
match[i]=u;
return true;
}
}
} }
return false;
}
int main()
{
n=read();m=read();
for(int i=;i<=m;i++)
{
int x,y;
x=read();y=read();
tc[x][y]=;
}
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(i!=j&&tc[i][j]==)
{
tc[i][j]=tc[i][j]||(tc[i][k]&&tc[k][j]);
}
for(int i=;i<=n;i++)
{
memset(book,,sizeof(book));
if(dfs(i))ans++;
}
write(n-ans);
return ;
}
请各位大佬斧正(反正我不认识斧正是什么意思)

最新文章

  1. windows charles response 乱码解决办法
  2. helios架构详解(一)服务器端架构
  3. java中的注解(Annotation)
  4. Codeforces Round #202 (Div. 2) A,B
  5. php截取字符串的实例代码(支持utf-8)
  6. soliworks三维机柜布局(二)创建设备位置
  7. 添加标签2 jquery 和JS
  8. YII 主题
  9. 细聊 Cocoapods 与 Xcode 工程配置
  10. 解决animate动画连续播放bug
  11. QTabWidget and QTabBar.的文字的颜色设置,三种方法
  12. ASP.NET中的C#基础知识
  13. 【Android Developers Training】 83. 实现高效网络访问来优化下载
  14. [题解] 2038: [2009国家集训队]小Z的袜子(hose)
  15. JSOI2018 简要题解
  16. 属性复制方法,当属性名字不一致时候可以传入匹配的Map
  17. c#接口与抽象类的区别(一)
  18. Attacks for RL
  19. 设计模式之UML类图六大关系辨析【2】
  20. centos7 安装步骤

热门文章

  1. Python07之分支和循环2(if...else、if...elif...else)
  2. 元组的简单介绍——参考Python编程从入门到实践
  3. Python re模块学习
  4. RVA与RWA的关系
  5. 手写DAO框架(五)-DAO层实现
  6. 原生js实现ajax封装
  7. OpenStack kilo版(6) 启动第一台虚拟机
  8. jmeter第一次使用
  9. 网络基础 URL
  10. Java中关于String类型的一些思考