关于P2341 【[USACO03NOV][HAOI2006]受欢迎的牛 G /【模板】强连通分量】

下面由我来讲一下这道毒(mu)瘤(ban)题;

请同学们坐稳了,老司机上高速了

什么是强连通分量?

有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。——百度百科

Tarjan是基于迪法师(DFS)的一种算法,可以说是一种流(du)批(liu)的操作,本蒟蒻苦哈哈的学了好几天才学会强连通分量和缩点;
具体讲解参考这篇文章

而这道题的意思是让我们找最受欢迎的奶牛,即被所有人喜欢且不喜欢别人的奶牛;

窝们可以先进行缩点,在缩完后的图中找出度为0的点的个数;若出度为0的点有2个即以上,则说明这个图不连通,那么直接输出0;

#include
#include
#include
#include
#include
#define Size 50005
using namespace std;
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
        f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
stack atack;
vector map[Size]; 
vector map2[Size]; 
int a,b,c,d,num=0,low[Size],dfn[Size],Ans,numb=0,bl[Size],out[Size],nums[Size];
bool inst[Size];
void tarjan(int now)
{
	dfn[now]=low[now]=++num;
	atack.push(now);
	inst[now]=true;
	for(int i=0;i=2){
		cout<<"0";
	}
	else cout<

你可能感兴趣的:(Tarjan)