LightOJ-1026 Critical Links Solutions C++
#include<bits/stdc++.h>
#define vi vector<int>
#define pb push_back
using namespace std;
vi g[10005];
int visit[10005],low[10005],in[10005];
vector<pair<int,int> > bridge;
int cnt,timer;
void dfs1(int s,int p)
{
visit[s]=1;
low[s]=in[s]=++timer;
for(int i=0;i<g[s].size();i++)
{
if(g[s][i]==p)
continue;
else if(visit[g[s][i]])
low[s]=min(in[g[s][i]],low[s]);
else
{
dfs1(g[s][i],s);
if(low[g[s][i]]>in[s])
{
cnt++;
if(g[s][i]>s)
bridge.pb(make_pair(s,g[s][i]));
else
bridge.pb(make_pair(g[s][i],s));
}
low[s]=min(low[g[s][i]],low[s]);
}
}
}
int main()
{
int t,n,e,u,v,cs=0;
char a,b,c;
cin>>t;
while(t--)
{
cnt=0,timer=0;
cin>>n;
for(int i=0;i<n;i++)
{
g[i].clear();
visit[i]=0;
}
bridge.clear();
for(int i=0;i<n;i++)
{
cin>>u;
scanf("%c%c%d%c",&c,&c,&e,&c);
while(e--)
{
cin>>v;
g[u].pb(v);
g[v].pb(u);
}
}
for(int i=0;i<n;i++)
{
if(!visit[i])
{
dfs1(i,-1);
}
}
// dfs1(0,-1);
cout<<"Case "<<++cs<<":"<<endl;
cout<<cnt<<" critical links"<<endl;
sort(bridge.begin(), bridge.end());
for(int i = 0; i <bridge.size(); i++)
{
cout << bridge[i].first << " - " << bridge[i].second << endl;
}
}
return 0;
}
Comments
Post a Comment