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. Finereport集群配置

    增加配置文件cluster.xml 将配置包resource文件夹下的cluster.xml打开,如果没有cluster.xml,则新建一个,基本内容如下: <?xml version=&quo ...

  2. iOS Core Animation之CALayer心得

    使用CALayer的mask实现注水动画效果 Core Animation一直是iOS比较有意思的一个主题,使用Core Animation可以实现非常平滑的炫酷动画.Core animtion的AP ...

  3. setValuesForKeysWithDictionary 的用法

    字典的快速赋值 setValuesForKeysWithDictionary 字数918 阅读6604 评论6 喜欢32 前言 在学习解析数据的时候,我们经常是这么写的:PersonModel.h文件 ...

  4. UDP异步通信

    先看效果图 Server: using System; using System.Collections.Generic; using System.Text; using System.Net; u ...

  5. Coursera Machine Learning : Regression 评估性能

    评估性能 评估损失 1.Training Error 首先要通过数据来训练模型,选取数据中的一部分作为训练数据. 损失函数可以使用绝对值误差或者平方误差等方法来计算,这里使用平方误差的方法,即: (y ...

  6. JavaWeb 学习003-简单登录页面功能实现

    先说下题外话:学习不是看你学了多久,重点是学到多少: 这就要求   效率.我在这三个小时,但是有效率的又有多久?只是做了这么一点简单的事. 登录页面 跟数据库交互,进行判断是否登陆成功.我只是实现了一 ...

  7. tomcat项目的部署

    当我们把web项目做好了以后,一般要进行部署,我一般采用两种方式来部署.一种是直接启动tomcat的startup.bat,一种是将tomcat做成服务. 1.第一种方法较为简单,先复制一份tomca ...

  8. 用js将从后台得到的时间戳(毫秒数)转换为想要的日期格式

    得到后台从数据库中拿到的数据我们希望格式是 2016年10月25日 17时37分30秒 或者 2016/10/25 17:37:30 然而我们前台得到的却是一段数字(时间戳,毫秒数) 14773860 ...

  9. convas demo1

    1 getContext 语法 Canvas.getContext(contextID) 参数 参数 contextID 指定了您想要在画布上绘制的类型.当前唯一的合法值是 "2d" ...

  10. 利用OpenShift托管Node.js Web服务进行微信公众号开发

    最近写了一个微信的翻译机器人.用户只要关注该公众号,发送英文的消息,就能收到中文翻译的回复.有兴趣的读者可以扫描下面的二维码关注该公众号,尝试发送英文单词试试看.(有时候第一次发送单词会收到“该公众号 ...