POJ2186 POPULAR COW
链接:http://poj.org/problem?id=2186
题意:给你N个点,然后在给你N条有向边,然后让你找出这样的点S,S满足条件图上任意一点都能到达S。
要想满足任意一点都能到达,首先满足图连通,然后满足将图缩点后形成一个棵树,树的特征是可以有且只有一个点的出度为0。
然后代码如下:
- #include <iostream>
- #include <vector>
- #include <queue>
- #include <string.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <stack>
- using namespace std;
- const int maxn = ;
- struct edge
- {
- int u,v,val;
- };
- int dfn[],low[],belong[],inst[];
- vector<edge> edges;
- vector<int>g[maxn];
- stack<int>st;
- int bcnt,cnt,time;
- void init(int n)
- {
- int i;
- for(i =;i <= n;i++)
- g[i].clear();
- edges.clear();
- time = ;bcnt = cnt = ;
- return ;
- }
- void addedge(int u,int v,int val)
- {
- edges.push_back((edge){u,v,});
- g[u].push_back(cnt);
- cnt++;
- return ;
- }
- void tarjan(int i)
- {
- int j;
- dfn[i] = low[i] = ++time;
- inst[i] = ;
- st.push(i);
- for(j = ;j < g[i].size();j++)
- {
- edge e;
- e = edges[g[i][j]];
- int v;
- v = e.v;
- if(!dfn[v])
- {
- tarjan(v);
- low[i] = min(low[i],low[v]);
- }
- else if(inst[v] && dfn[v] < low[i])
- low[i] = dfn[v];
- }
- if(dfn[i] == low[i])
- {
- //cout<<i<<"****"<<endl;
- bcnt++;
- do
- {
- j = st.top();
- st.pop();
- inst[j] = ;
- belong[j] = bcnt;
- //printf("%d *",j);
- }
- while(j != i);
- //puts("");
- }
- }
- void tarjans(int n)
- {
- int i;
- bcnt = time = ;
- while(!st.empty())st.pop();
- memset(dfn,,sizeof(dfn));
- memset(inst,,sizeof(inst));
- memset(belong,,sizeof(belong));
- for(i = ;i <= n;i++)
- if(!dfn[i])tarjan(i);
- }
- int main()
- {
- int n,m;
- //freopen("in.txt","r",stdin);
- while(~scanf("%d %d",&n,&m))
- {
- int a,b,i;
- init(n);
- for(i = ;i < m;i++)
- {
- scanf("%d %d",&a,&b);
- addedge(a,b,);
- }
- tarjans(n);
- //cout<<bcnt<<endl;
- int leap = ,flag = ;
- int bcnt0,j;
- int outbc[];
- memset(outbc,,sizeof(outbc));
- for(i = ;i <= n;i++)
- {
- for(j = ;j < g[i].size();j++)
- {
- int v;
- v = edges[g[i][j]].v;
- if(belong[i] != belong[v]){
- if(outbc[belong[i]] == )
- leap++;
- outbc[belong[i]] = ;
- }
- }
- }
- if(leap == bcnt-)
- {
- int ans;
- ans = ;
- for(i = ;i < bcnt+;i++)
- {
- if(outbc[i] == )
- break;
- }
- for(j = ;j <= n;j++)
- if(belong[j] == i)
- ans++;
- printf("%d\n",ans);
- }
- else
- puts("");
- }
- return ;
- }
POJ2186 POPULAR COW的更多相关文章
- POJ2186 Popular Cows [强连通分量|缩点]
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 31241 Accepted: 12691 De ...
- POJ2186 Popular Cows
Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= ...
- POJ2186 Popular Cows 【强连通分量】+【Kosaraju】+【Tarjan】+【Garbow】
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 23445 Accepted: 9605 Des ...
- 强连通分量tarjan缩点——POJ2186 Popular Cows
这里的Tarjan是基于DFS,用于求有向图的强联通分量. 运用了一个点dfn时间戳和low的关系巧妙地判断出一个强联通分量,从而实现一次DFS即可求出所有的强联通分量. §有向图中, u可达v不一定 ...
- 【Tarjan缩点】POJ2186 Popular Cows
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 35644 Accepted: 14532 De ...
- poj2186 Popular Cows 题解——S.B.S.
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29642 Accepted: 11996 De ...
- 洛谷——P2341 [HAOI2006]受欢迎的牛//POJ2186:Popular Cows
P2341 [HAOI2006]受欢迎的牛/POJ2186:Popular Cows 题目背景 本题测试数据已修复. 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所 ...
- POJ2186 Popular Cows 强连通分量tarjan
做这题主要是为了学习一下tarjan的强连通分量,因为包括桥,双连通分量,强连通分量很多的求法其实都可以源于tarjan的这种方法,通过一个low,pre数组求出来. 题意:给你许多的A->B ...
- POJ-2186 Popular Cows,tarjan缩点找出度为0的点。
Popular Cows 题意:一只牛崇拜另外一只牛,这种崇拜关系可以传导.A->B,B->C =>A->C.现在给出所有的关系问你有多少牛被其他所有的牛都崇拜. 思路:就是一 ...
随机推荐
- 添加hive默认配置hiverc
可以在$HOME中加一个.hiverc文件,并在里面配置hive启动的一些参数. Fro example: http://hadooped.blogspot.com/2013/08/hive-hive ...
- Linux 双线策略路由的三种实现方式总结+端口映射
Linux 双线策略路由的三种实现方式总结+端口映射 Linux 双线策略路由的三种实现方式总结+端口映射 网络环境 服务器(网关): eth0 为LAN口,IP为 LAN_IP = 192.168. ...
- delphi 网络函数
Delphi网络函数 unit net; interfaceusessysutils,windows,dialogs,winsock,classes,comobj,wininet; //得到本机的局域 ...
- UVA 562 Dividing coins (01背包)
题意:给你n个硬币,和n个硬币的面值.要求尽可能地平均分配成A,B两份,使得A,B之间的差最小,输出其绝对值.思路:将n个硬币的总价值累加得到sum, A,B其中必有一人获得的钱小于等于sum/2 ...
- 2014多校第六场 1010 || HDU 4930 Fighting the Landlords (模拟)
题目链接 题意 : 玩斗地主,出一把,只要你这一把对方要不了或者你出这一把之后手里没牌了就算你赢. 思路 : 一开始看了第一段以为要出很多次,实际上只问了第一次你能不能赢或者能不能把牌出尽. #inc ...
- linux下tigervnc-servere服务的安装与使用
关于tigervnc-servere的安装,可以直接使用本地yum源进行安装. [root@ ~]# yum install tigervnc-server -y 其中tigervnc的主要配置文件位 ...
- sql主键的一点重要理解
sql只会读取数据,不会自动设置主键,所以绑定数据后要设置主键(前台) 不管是int或者uniqueidentifier只要类型对得上就可以用,int自增其实没什么太大优势(但是通常都会用自增来做,从 ...
- 配置IIS应用程序池
IIS 6的核心在于工作进程隔离模式,而应用程序池则是定义工作进程如何进行工作,因此,可以说应用程序池是整个IIS 6的核心. 和IIS 5中只能使用单个应用程序池不同,工作在工作进程隔离模式的IIS ...
- Android是什么 之三手机之硬件形态
手机硬件形态 本节可能与Android无关,但是Android系统现在这个阶段更多的是移动终端形态的开发平台,本节给出了Android背后的工作-Android管理的硬件是什么,Android的本质就 ...
- Linux软链接和硬链接
Linux中的链接有两种方式,软链接和硬链接.本文试图清晰彻底的解释Linux中软链接和硬链接文件的区别. 1.Linux链接文件 1)软链接文件 软链接又叫符号链接,这个文件包含了另一个文件的路径 ...