796 - Critical Links

#include<bits/stdc++.h>
#define NIL -1
#define sz 1000

using namespace std;
vector<int>adj[sz];
bool links[sz][sz];

bool visited[sz];

int par[sz],counter,shomoy;
int start[sz];
int low[sz];

void articulation(int u)
{
    int child=0;
    visited[u]=true;
    ++shomoy;
    start[u]=shomoy;
    low[u]=shomoy;
    for(int i=0;i<adj[u].size();i++)
    {
        int v = adj[u][i];

        if(visited[v]==false)
        {
            child++;
            par[v]=u;
            articulation(v);

            if(low[v]>start[u])
            {
                counter++;
                links[u][v]=links[v][u]=true;
            }

            low[u]= min(low[u],low[v]);
        }
        else if(v!=par[u])
        {
            low[u] = min(low[u],start[v]);
        }
    }
}

int main()
{
    int test,n,i,j,k,node,a;
    char ch,ch1;
    while(scanf("%d",&n)==1)
    {
        for(i=1;i<=n;i++)
        {
            scanf("%d %c%d%c",&node,&ch,&k,&ch1);
            par[node]=NIL;
            for(j=0;j<k;j++)
            {
                scanf("%d",&a);
                adj[node].push_back(a);
            }
        }

        shomoy=0;
        counter=0;

        for(i=0;i<n;i++)
        {
            if(visited[i]==false)
            {
                articulation(i);
            }
        }

        printf("%d critical links\n",counter);

        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                if(links[i][j]==true && i<j)
                {
                    printf("%d - %d\n",i,j);
                }
            }
        }
        printf("\n");
        for(i=0;i<=n;i++)
        {
            adj[i].clear();
        }
        memset(visited,false,sizeof(visited));
        memset(par,0,sizeof(par));
        memset(links,false,sizeof(links));
    }
    return 0;
}

0 comments: (+add yours?)