zoukankan      html  css  js  c++  java
  • 牛的舞会

    题目链接

    tarjan基本思路:强连通分量在搜索树上有返祖边,,细节见代码

    #include<bits/stdc++.h>
    using namespace std;
    int head[100000],ans=0,in[100000],cnt=0,cnt_=0,low[100000],dfn[100000],t=0,sta[100000];
    struct node{
    	int to,nxt;
    }road[100000];
    void build(int u,int v)
    {
    	road[++cnt].to=v;
    	road[cnt].nxt=head[u];
    	head[u]=cnt;//QAQ写错建图可还行 
    }
    void tarjan(int u,int f)
    {
    	low[u]=dfn[u]=++t;
    	in[u]=1;sta[++cnt_]=u;
    	for(int i=head[u];i;i=road[i].nxt)
    	{
    		int v=road[i].to;
    		if(v==f) 
    		{
    			low[u]=min(low[u],dfn[f]);//QAQ父亲节点能到达的话也要算 ?为什么是dfn 
    			continue;
    		}
    		if(!dfn[v])
    		{
    			tarjan(v,u);
    			low[u]=min(low[u],low[v]);
    		}
    		else if(in[u]==1) low[u]=min(low[u],dfn[v]);//?为什么是dfn 
    	}
    	if(dfn[u]==low[u])
    	{
    		int sum=0;
    		while(sta[cnt_]!=u)
    		{
    			in[sta[cnt_]]=0;
    			sum++;
    			cnt_--;
    		}
    		in[sta[cnt_]]=0;
    		sum++;
    		cnt_--;//QAQ把u也弹出来 
    		if(sum>1) ans++;
    	}
    }
    int main()
    {
    	int n,m,u,v;
    	cin>>n>>m;
    	for(int i=1;i<=m;i++)
    	{
    		cin>>u>>v;
    		build(u,v);
    	}
    	for(int i=1;i<=n;i++)
    	{
    		if(!dfn[i])
    		{
    			tarjan(i,0);
    		}
    	}
    	cout<<ans;
    	return 0;
    }
    
  • 相关阅读:
    python之set
    python之tuple
    python之list
    python之Number
    LAMP源码安装,搭建zabbix监控
    linux sshd服务
    linux rsync服务
    linux 实时同步inotify
    搭建LNMP;搭建WIKI
    数字,列表,函数
  • 原文地址:https://www.cnblogs.com/qwq-/p/13614430.html
Copyright © 2011-2022 走看看