图的连通性-tarjan模板(2)

来源:互联网 发布:计算机等级二级c语言 编辑:程序博客网 时间:2024/05/18 02:06
#include<cstdio>#include<cstring>#include<iostream>#include<stack>using namespace std;const int maxn=201;const int Maxn=101;int top;struct edge{    int to,next;};edge side[maxn];int head[maxn];void addEdge(int from,int to){    side[top]=(edge){to,head[from]};    head[from]=top++;}int Min(int a,int b){    return a<b?a:b;}int dfn[maxn],low[maxn];stack<int> s;int t,sum;void dfs(int u){    dfn[u]=low[u]=t++;    s.push(u);    for(int i=head[u];i!=-1;i=side[i].next)    {        int v=side[i].to;        if(!dfn[v])            dfs(v);        if(dfn[v]!=-1)            low[u]=Min(low[v],low[u]);    }    int v;    if(dfn[u]==low[u])    {        int v;        do{            v=s.top();            s.pop();            dfn[v]=-1;            low[v]=sum;        }while(v!=u);        sum++;    }}void solve(int n){    sum=t=1;    memset(dfn,0,sizeof(dfn));    for(int i=1;i<=n;i++)        if(!dfn[i])dfs(i);}int main(){    int n,m;    while(~scanf("%d%d",&n,&m))    {        int start,end;        for(int i=0;i<m;i++)        {            scanf("%d%d",&start,&end);            addEdge(start,end);        }        solve(n);    }    return 0;}

0 0
原创粉丝点击