zoukankan      html  css  js  c++  java
  • hdu 1269 强连通图 tarjian算法 计算环有多少个

    代码不能粘贴复制,只有充分理解之后自己亲手敲的才是真正理解了,

    即使是参考他人的也有收获

    理解了tarjian算法让自己对算法有了好感,感觉算法真的好强,解决看起来不能解决的问题,

    那是一种超越

    #include <iostream>
    #include <cstdio>
    #include <vector>
    #include <stack>
    #include <algorithm>
    using namespace std;
    
    #define MAXVER 10010
    
    vector<int> g[MAXVER];
    
    stack<int> st;
    
    int visit[MAXVER];
    
    int instack[MAXVER];
    
    int dfn[MAXVER],low[MAXVER];
    
    int n,m,index,num;
    
    void tarjian(int u)
    {
    
    	int i,v;
    	dfn[u]=low[u]=index++;
    	st.push(u);
    	instack[u]=1;
    	visit[u]=1;
    
    	for(i=0;i<g[u].size();i++)
    	{
    		v=g[u][i];
    
    		if(!visit[v])
    		{
    			tarjian(v);
    			low[u]=low[u]<low[v]?low[u]:low[v];
    		}else if(instack[v])
    		{
    			low[u]=low[u]<dfn[v]?low[u]:dfn[v];
    		}
    	}
    
    	if(dfn[u]==low[u])
    	{
    		do
    		{
    			v=st.top();
    			instack[v]=0;
    			st.pop();
    		}while(u!=v);
    			num++;
    	}
    
    	if(num>=2)
    		return;
    }
    
    int main()
    {
    	int start,end,i;
    
    	while(scanf("%d%d",&n,&m),n+m)
    	{
    		for(i=0;i<=n;i++)
    			g[i].clear();
    
    		for(i=0;i<m;i++)
    		{
    			scanf("%d%d",&start,&end);
    			g[start].push_back(end);
    		}
    			
    		memset(visit,0,sizeof(visit));
    		memset(instack,0,sizeof(instack));
    		index=0;
    		num=0;
    
    		for(i=1;i<=n;i++)
    		{
    			if(!visit[i])
    				tarjian(i);
    			if(num>=2)
    				break;
    		}
    
    		if(num==1)
    			printf("Yes\n");
    		else
    			printf("No\n");
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    Centos 7 快速安装 Docker
    MySQL乱码
    阿里云中linux 下svn服务器安装
    java中易错点(二)
    java中易错点(一)
    mysql5.7.24 解压版安装步骤以及遇到的问题
    linux交换分区调整
    linux之切换用户su(switch user)
    linux简单常用命令
    Yum简单使用小结
  • 原文地址:https://www.cnblogs.com/jackes/p/2423542.html
Copyright © 2011-2022 走看看