洛谷P2341 [HAOI2006]受欢迎的牛(tarjan+缩点) 题解

题目来源:

https://www.luogu.org/problemnew/show/P2341

题目描述:

 

题目描述

每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶

牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果A喜

欢B,B喜欢C,那么A也喜欢C。牛栏里共有N 头奶牛,给定一些奶牛之间的爱慕关系,请你

算出有多少头奶牛可以当明星。

输入输出格式

输入格式:

 第一行:两个用空格分开的整数:N和M

 第二行到第M + 1行:每行两个用空格分开的整数:A和B,表示A喜欢B

输出格式:

 第一行:单独一个整数,表示明星奶牛的数量

输入输出样例

输入样例#1: 复制

3 3
1 2
2 1
2 3

输出样例#1: 复制

1

说明

只有 3 号奶牛可以做明星

【数据范围】

10%的数据N<=20, M<=50

30%的数据N<=1000,M<=20000

70%的数据N<=5000,M<=50000

100%的数据N<=10000,M<=50000

解题思路:

      这题好像是tarjan的经典题,我们先用tarjan算出所有的强联通分量,然后缩点,重新建图,算出所有点的入度出度,如果出度为零的点大于1个,那么一定没有明星牛,如果个数是一个,那么明星牛就是那个点对应强连通分量的分量数。。。

代码:

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
using namespace std;
vector<int>E[50005];
int dfn[10005],low[10005],tot,gs,rd[10005],fl[10005],cd[10005],lt[10005];
int n,m;
bool vis[10005],ins[10005];
stack<int>s;
void tarjan(int u)
{
	dfn[u]=low[u]=++tot;
	vis[u]=ins[u]=1;
	s.push(u);
	for(int i=0;i<E[u].size();i++)
	{
		int v=E[u][i];
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(ins[v]){
			low[u]=min(low[u],dfn[v]);
		}
	}
	if(dfn[u]==low[u]){
		gs++;
		int ans=0;
		while(1)
		{
			ans++;
			int now=s.top();
		//	cout<<now<<" ";
			s.pop();
			ins[now]=0;
			vis[u]=0;
			lt[now]=gs;
			if(now==u)break;
		}
	//	cout<<endl;
		fl[gs]=ans;
		//cout<<gs<<" "<<fl[gs]<<endl;
	}
}
int main()
{
//	memset(dfn,0,sizeof(dfn));
//	memset(low,0,sizeof(low));
//	memset(ins,0,sizeof(ins));
//	memset(vis,0,sizeof(vis));
	tot=0;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int a,b;
		cin>>a>>b;
		E[a].push_back(b);
	}
	gs=0;
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i])tarjan(i);
	}
	for(int i=1;i<=n;i++)
	for(int j=0;j<E[i].size();j++)
	{
		int v=E[i][j];
		if(lt[i]==lt[v])continue;
		cd[lt[i]]++;rd[lt[v]]++;
	}
	int id,sum=0;
	for(int i=1;i<=gs;i++)
	{
		//cout<<cd[i]<<endl;
		if(cd[i]==0){
			sum++;
			id=i;
		}
	}
	if(sum>1)cout<<0<<endl;
	else cout<<fl[id]<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40400202/article/details/81085573
今日推荐