zoukankan      html  css  js  c++  java
  • tarjan缩点-受欢迎的牛-笔记

    tarjan模板?emmmm,洛谷P2341。一些对于模板的解释在代码注释里。

    #include<cstdio>///板子借鉴自hzwer ,%%%hzwer 
    #include<cstring> 
    #include<cstdlib> 
    #include<cmath>
    #include<algorithm>
    #define MAXN 10005
    #define MAXM 50005
    using namespace std;
    struct data{
    	int to,next;
    }e[MAXM],d[MAXM];
    int head[MAXN];
    int n,m,cnt,top;
    int dfn[MAXN],low[MAXN],q[MAXN];
    int scc,h[MAXN],belong[MAXN],hav[MAXN];
    bool vis[MAXN],inq[MAXN];
    int ans;
    void dfs(int a){
    	int now;
    	vis[a]=inq[a]=1;
    	low[a]=dfn[a]=++cnt;
    	q[++top]=a;
    	int c=head[a];
    	while(c){///找爸爸 找爸爸 
    		if(!vis[e[c].to ]){
    			dfs(e[c].to );
    			low[a]=min(low[a],low[e[c].to ]);
    		}
    		else if(inq[e[c].to ]) low[a]=min(low[a],dfn[e[c].to ]);
    		c=e[c].next ;
    	}
        if(low[a]==dfn[a]){////如果a就是SCC的根 
        	scc++;
        	while(now!=a){////把这个SCC出栈 
        		now=q[top--];
        		inq[now]=0;
        		belong[now]=scc;
        		++hav[scc];
    		}
    	}
    }
    void rebuild(){///SCC找完了,重新建图
    	cnt=0;     
    	for(int i=1;i<=n;i++){
    		int c=head[i];
    		while(c){////当i还有出度的时候 
    			if(belong[i]!=belong[e[c].to]){
    			 d[++cnt].to =belong[e[c].to ];
    			 d[cnt].next =h[belong[i]];
    			 h[belong[i]]=cnt;
    		    }
    		    c=e[c].next ;
            }
        }
    } 
    void tarjan(){
    	for(int i=1;i<=n;i++) if(!vis[i]) dfs(i);
    	rebuild();
    }
    void work(){
    	for(int i=1;i<=scc;i++)
    	  if(!h[i]){/////避免出现多个叶子节点 
    	  	if(ans){
    		 ans=0;return; 
    	    }
    		else ans=hav[i];
    	  }
    	
    }
    int main(){
    	scanf("%d%d",&n,&m);
    	int a,b;
    	for(int i=1;i<=m;i++){
    		scanf("%d%d",&a,&b);
    		e[++cnt].to =b;
    		e[cnt].next =head[a];
    		head[a]=cnt;
    	}
    	tarjan();
    	work();
    	printf("%d",ans);
    	return 0;
    }
    

  • 相关阅读:
    牛客编程巅峰赛S1第8场
    【杭电多校4】2020 Multi-University Training Contest 4
    2020牛客暑期多校训练营(第七场)
    DFS【搜索1】
    2020牛客暑期多校训练营(第六场)
    2020牛客暑期多校训练营(第五场)
    大数模板
    分布式前后端分离项目开发步骤
    Linux 查看服务器硬件信息
    写在前面
  • 原文地址:https://www.cnblogs.com/nishida-rin/p/12271145.html
Copyright © 2011-2022 走看看