zoukankan      html  css  js  c++  java
  • HDU 1269

    很水的TARJAN求强联通图的问题。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    const int N=10010;
    const int M=100010;
    int head[N],dfn[N],low[N],stack[N],st;
    struct Edge{
    	int u,v;
    	int nxt;
    }edge[M];
    int tot,n,m,nTime,btn;
    int vis[N];
    bool instack[N];
    void addedge(int u,int v){
    	edge[tot].u=u;
    	edge[tot].v=v;
    	edge[tot].nxt=head[u];
    	head[u]=tot++;
    }
    
    void tarjan(int u,int ufa){
    	dfn[u]=low[u]=++nTime;
    	stack[++st]=u;
    	instack[u]=true;
    	for(int e=head[u];e!=-1;e=edge[e].nxt){
    		int v=edge[e].v;
    	//	cout<<v<<endl;
    		if(dfn[v]==-1){
    			tarjan(v,u);
    			low[u]=min(low[u],low[v]);
    		}
    		else if(instack[v])
    		low[u]=min(low[u],dfn[v]);
    	}
    	if(dfn[u]==low[u]){
    		int v; btn++;
    		do{
    			v=stack[st--];
    			vis[v]=btn;
    		}while(u!=v);
    	}
    }
    
    int main(){
    	int u,v;
    	while(scanf("%d%d",&n,&m),n||m){
    		memset(head,-1,sizeof(int)*(n+5));
    		memset(dfn,-1,sizeof(int)*(n+5));
    		memset(low,-1,sizeof(int)*(n+5));
    		memset(vis,0,sizeof(int)*(n+5));
    		memset(instack,false,sizeof(bool)*(n+5));
    		tot=0;
    		nTime=0;
    		st=0;
    		btn=0;
    		for(int i=1;i<=m;i++){
    			scanf("%d%d",&u,&v);
    			addedge(u,v);
    		}
    		tarjan(1,0);
    		bool flag=true;
    		for(int i=2;i<=n;i++)
    		if(vis[i]!=vis[1]){
    			flag=false;
    			break;
    		}
    		if(flag){
    			puts("Yes");
    		}
    		else puts("No");
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    06.SpringMVC之参数绑定
    05.SpringMVC之请求映射
    04.SpringMVC之用
    03.SpringMVC之器
    02.SpringMVC之初体验
    01.SpringMVC之概述
    Spring 中的Null-Safety
    Spring中Resource(资源)的获取
    Spring的事件机制详解
    Spring详解(二)------注解配置IOC
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4135305.html
Copyright © 2011-2022 走看看