Description

总部最近打算向下面的N个工作人员发出了一条秘密消息。因为它是机密,所以只能一对一的传递消息,也就是说每一个人知道消息之后只能把消息传给他能够传达到的且还未知道该消息的若干个人中的一个。对于A、B两个人,可能存在A能够传消息给B,而B无法传消息给A的情况。现在总部为了防止消息被泄露,命令你计算最开始总部至少要告诉多少人消息,才能保证最终所有人都知道了这个消息。

Input

第一行,N、M。
接下来M行,每行两个数字A、B,表示A号能够传消息给B号。
(N个人的编号是1~N)
1≤N≤100 000
1≤M≤300 000 

Output

一个数字,最少需要由总部告知的人数

Sample Input

4 3
1 4
4 3
1 2

Sample Output

2
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std; #define N 100100
#define INF 0xfffffff struct Node
{
int v, next;
} a[N*]; int head[N], cnt, n, m;
bool used[N];
int Mx[N], My[N], depth; ///记录的所匹配的端点,0表示未匹配
int dx[N], dy[N]; ///BFS分层时,记录点所在的层,-1表示不在分层 void Init()
{
cnt = ;
memset(head, -, sizeof(head));
} void Add(int u, int v)
{
a[cnt].v = v;
a[cnt].next = head[u];
head[u] = cnt++;
} bool BFS()///如果发现y这边有增广路,返回1,否则返回0
{
queue<int> Q;
depth = INF; memset(dx, -, sizeof(dx));
memset(dy, -, sizeof(dy)); for(int i=; i<=n; i++)
{
if( Mx[i] == false )
{
dx[i] = ;
Q.push(i);
}
} while(Q.size())
{
int u = Q.front();
Q.pop();
if(dx[u] > depth) break;///已经找到了增广路,不必寻找下层 for(int j=head[u]; j!=-; j=a[j].next)
{
int v = a[j].v; if( dy[v] == - )
{
dy[v] = dx[u] + ; if(My[v] == false)
depth = dy[v];
else
{
dx[ My[v] ] = dy[v] + ;
Q.push( My[v] );
}
}
}
} if( depth == INF )
return false;
return true;
}
bool Find(int i)
{
for(int j=head[i]; j!=-; j=a[j].next)
{
int v = a[j].v; if( !used[v] && dx[i] == dy[v]-)
{
used[v] = true; if( My[v] && dy[v] == depth )
continue;///不会在下一层,因为还没有对下层进行增广 if( !My[v] || Find( My[v] ) )
{
My[v] = i;
Mx[i] = v;
return true;
}
}
} return false;
} int Karp()
{
int ans = ;
memset(Mx, false, sizeof(Mx));
memset(My, false, sizeof(My)); while( BFS() == true )
{
///如果还存在增广路
memset(used, false, sizeof(used));
for(int i=; i<=n; i++)
{
if( !Mx[i] && Find(i) == true )
ans++;
}
} return ans;
} int main()
{
int m, i, x, y; scanf("%d%d", &n, &m);
Init(); for(i=; i<=m; i++)
{
scanf("%d%d", &x, &y);
Add(x, y);
} int ans = Karp(); printf("%d\n", n-ans); return ;
}

(最小路径覆盖) News 消息传递 (hust OJ 2604)的更多相关文章

  1. Light OJ 1429 Assassin`s Creed (II) BFS+缩点+最小路径覆盖

    题目来源:Light OJ 1429 Assassin`s Creed (II) 题意:最少几个人走全然图 能够反复走 有向图 思路:假设是DAG图而且每一个点不能反复走 那么就是裸的最小路径覆盖 如 ...

  2. Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖

    标题来源:problem=1406">Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路: ...

  3. Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖

    题目来源:Light OJ 1406 Assassin`s Creed 题意:有向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问题 ...

  4. UVALive - 7368 Airports DAG图的最小路径覆盖

    题目链接: http://acm.hust.edu.cn/vjudge/problem/356788 Airports Time Limit: 3000MS 问题描述 An airline compa ...

  5. UVAlive3126 Taxi Cab Scheme(DAG的最小路径覆盖)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32568 [思路] DAG的最小路径覆盖. 将每个人看做一个结点,如 ...

  6. (匹配 最小路径覆盖)Air Raid --hdu --1151

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1151 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  7. POJ 3020 Antenna Placement【二分匹配——最小路径覆盖】

    链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...

  8. 【HDU1960】Taxi Cab Scheme(最小路径覆盖)

    Taxi Cab Scheme Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  9. loj 1429(可相交的最小路径覆盖)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1429 思路:这道题还是比较麻烦的,对于求有向图的可相交的最小路径覆盖,首先要解决成环问 ...

  10. 【HDU3861 强连通分量缩点+二分图最小路径覆盖】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 题目大意:一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.有边u到v以及有 ...

随机推荐

  1. linux命令(8):cp 命令

    cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是如果是 ...

  2. HTML5 新增属性和废除属性

    删除的属性大多都是可以用CSS替代的一些样式属性 设置网页标题前面的小图标的大小:size <link rel="icon" href="demo_icon.gif ...

  3. Linux 中 Vi 编辑器的简单操作

    Linux 中 Vi 编辑器的简单操作 Vi 编辑器一共有3种模式:命名模式(默认),尾行模式,编辑模式.3种模式彼此需要切换. 一.进入 Vi 编辑器的的命令 vi  filename //打开或新 ...

  4. python学习之——splinter介绍

    Splinter是什么: 是一个用 Python 编写的 Web 应用程序进行验收测试的工具. Splinter执行的时候会自动打开你指定的浏览器,访问指定的URL,然后你所开发的模拟的任何行为,都会 ...

  5. GO_order

    Gpos Q8RP81 有GO:0000015 P47437 有GO:0000049 P06535 有GO:0000155 Q99027 有GO:0000160 P35594 有GO:0000166 ...

  6. .net学习笔记--文件读写的几种方式

    在.net中有很多有用的类库来读写硬盘上的文件 一般比较常用的有: File:1.什么时候使用:当读写件大小不大,同时可以一次性进行读写操作的时候使用         2.不同的方式可以读写文件类型不 ...

  7. oracle 第一章总结

    sysdba:  即数据库管理员,权限包括:打开数据库服务器.关闭数据库服务器.备份数据库.恢复数据库.日志归档.会话限制.管理功能.创建数据库.sys用户必须用 sysdba身份才能登录,syste ...

  8. 浏览器缓存详解:expires,cache-control,last-modified,etag详细说明

    最近在对CDN进行优化,对浏览器缓存深入研究了一下,记录一下,方便后来者 画了一个草图: 每个状态的详细说明如下: 1.Last-Modified 在浏览器第一次请求某一个URL时,服务器端的返回状态 ...

  9. 深入浅出Node.js(一):什么是Node.js

    Node.js从2009年诞生至今,已经发展了两年有余,其成长的速度有目共睹.从在github的访问量超过Rails,到去年底Node.jsS创始人Ryan Dalh加盟Joyent获得企业资助,再到 ...

  10. 模拟XShell的小项目

    不知道大家有没有用过XShell这款工具,这款工具通过windows可以远程操作处于开机状态的linux操作系统,也就是说把你的电脑和一台服务器连入网络,你通过输入服务器所在的IP地址建立一个会话就可 ...