poj2186 强连通
题意:有 n 头牛,以及一些喜欢关系,牛 A 喜欢牛 B,这种关系可以传递,问有多少头牛被牧场上所有牛喜欢。
首先强连通,因为在同一个强连通分量中牛是等价的,然后对于一个有向无环图看是否只有一个强连通分量出度为 0 ,如果是,则这个强连通分量中的点都是答案,否则为 0。
- #include<stdio.h>
- #include<string.h>
- #include<stack>
- #include<queue>
- using namespace std;
- const int maxn=;
- const int maxm=;
- int head[maxn],point[maxm],nxt[maxm],size;
- int n,t,scccnt;
- int stx[maxn],low[maxn],scc[maxn],od[maxn];
- stack<int>S;
- void init(){
- memset(head,-,sizeof(head));
- size=;
- memset(od,,sizeof(od));
- }
- void add(int a,int b){
- point[size]=b;
- nxt[size]=head[a];
- head[a]=size++;
- }
- void dfs(int s){
- stx[s]=low[s]=++t;
- S.push(s);
- for(int i=head[s];~i;i=nxt[i]){
- int j=point[i];
- if(!stx[j]){
- dfs(j);
- low[s]=min(low[s],low[j]);
- }
- else if(!scc[j]){
- low[s]=min(low[s],stx[j]);
- }
- }
- if(low[s]==stx[s]){
- scccnt++;
- while(){
- int u=S.top();S.pop();
- scc[u]=scccnt;
- if(s==u)break;
- }
- }
- }
- void setscc(){
- memset(stx,,sizeof(stx));
- memset(scc,,sizeof(scc));
- t=scccnt=;
- for(int i=;i<=n;++i)if(!stx[i])dfs(i);
- for(int i=;i<=n;++i){
- for(int j=head[i];~j;j=nxt[j]){
- int k=point[j];
- if(scc[i]!=scc[k]){
- od[scc[i]]++;
- }
- }
- }
- }
- int main(){
- int m;
- while(scanf("%d%d",&n,&m)!=EOF){
- init();
- while(m--){
- int a,b;
- scanf("%d%d",&a,&b);
- add(a,b);
- }
- setscc();
- int ans=;
- if(scccnt==)printf("%d\n",n);
- else{
- for(int i=;i<=scccnt;++i)if(!od[i])ans++;
- if(ans!=){
- printf("0\n");
- }
- else{
- ans=;
- for(int i=;i<=n;++i){
- if(!od[scc[i]])ans++;
- }
- printf("%d\n",ans);
- }
- }
- }
- return ;
- }
poj2186 强连通的更多相关文章
- poj2186 强连通缩点
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29773 Accepted: 12080 De ...
- POJ2186 强连通分量+缩点
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 40234 Accepted: 16388 De ...
- 强连通分量tarjan缩点——POJ2186 Popular Cows
这里的Tarjan是基于DFS,用于求有向图的强联通分量. 运用了一个点dfn时间戳和low的关系巧妙地判断出一个强联通分量,从而实现一次DFS即可求出所有的强联通分量. §有向图中, u可达v不一定 ...
- 强连通分量+poj2186
强连通分量:两个点能够互相连通. 算法分解:第一步.正向dfs全部顶点,并后序遍历 第二步,将边反向,从最大边dfs,构成强连通分量 标号最大的节点属于DAG头部,cmp存一个强连通分量的拓扑序. p ...
- POJ2186 Popular Cows(强连通分量)
题目问一个有向图所有点都能达到的点有几个. 先把图的强连通分量缩点,形成一个DAG,那么DAG“尾巴”(出度0的点)所表示的强连通分量就是解,因为前面的部分都能到达尾巴,但如果有多个尾巴那解就是0了, ...
- POJ2186 Popular Cows 强连通分量tarjan
做这题主要是为了学习一下tarjan的强连通分量,因为包括桥,双连通分量,强连通分量很多的求法其实都可以源于tarjan的这种方法,通过一个low,pre数组求出来. 题意:给你许多的A->B ...
- poj2186 Popular Cows(强连通)
崇拜有传递性.求所有牛都崇拜的牛tarjan算法求强连通. 如果不连通就不存在.如果联通,缩点后唯一一个出度为零的点就是答案,有多个则不存在. #include <vector> #inc ...
- POJ2186 Popular Cows 【强连通分量】+【Kosaraju】+【Tarjan】+【Garbow】
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 23445 Accepted: 9605 Des ...
- poj2186 Popular Cows --- 强连通
给一个有向图,问有多少结点是其它全部结点都能够到达的. 等价于,在一个有向无环图上,找出度为0 的结点.假设出度为0的结点仅仅有一个,那么这个就是答案.假设大于1个.则答案是0. 这题有环.所以先缩点 ...
随机推荐
- Program L 暴力求解
Description The GeoSurvComp geologic survey company is responsible for detecting underground oil dep ...
- matlab blkproc
有关blkproc 命令的使用 (2011-07-31 09:52:57) 标签: 杂谈 分类: matlab使用 如果你让matlab帮你计算最好的块大小,用bestblk函数,[MB,NB] = ...
- (转)UIApplication sharedApplication详细解释-IOS
iPhone应用程序是由主函数main启动,它负责调用UIApplicationMain函数,该函数的形式如下所示: int UIApplicationMain ( int argc, char *a ...
- 从github上面拷贝源码
http://www.cnblogs.com/xing901022/p/4287064.html
- <转>用thinkPHP实现验证码的功能
许多系统的登录都有验证码,而如果使用thinkPHP框架搭建网站的话,验证码的生成和验证就比较容易了 1.生成验证码 thinkPHP有对应生成验证码的方法 要使用验证码,需要导入扩展类库中的ORG. ...
- 等价表达式(noip2005)
3.等价表达式 [问题描述] 兵兵班的同学都喜欢数学这一科目,中秋聚会这天,数学课代表给大家出了个有关代数表达式的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也 ...
- JS 基于面向对象的 轮播图1
---恢复内容开始--- 1 'use strict' 2 function Tab(id){ 3 if(!id)return; 4 this.oBox = document.getElementBy ...
- 创建一个Windows窗体
20140702加: WS_OVERLAPPEDWINDOW这个属性如果写成WS_OVERLAPPED,则窗口没有最大最小按钮以及左边的系统的菜单. vs2010下的代码提示快捷键:CTRL + J ...
- 极客DIY:打造属于自己的无线移动渗透测试箱
本文中介绍的工具.技术带有一定的攻击性,请合理合法使用. 你想不想拥有一款属于自己的移动无线渗透测试箱,如果你感兴趣,下面介绍的设备将会对你很有帮助.这个箱子被称为“MiTM(中间人攻击)WiFi箱” ...
- php大力力 [005节] php大力力简单计算器001
2015-08-22 php大力力005. php大力力简单计算器001: 上网看视频,看了半天,敲击代码,如下: <html> <head> <title>简单计 ...