#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;
}
#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?)
Post a Comment