#include<iostream>//tarjan
#include<cstdio>
#include<cstdlib>
#include<string>
#include<vector>
#include<algorithm>
#include<stack>
#include<cstring>
using namespace std;
const int maxn=10005;
vector<int> v[maxn];
int dfn[maxn],low[maxn],par[maxn],cnt;
struct Edge{
int s,e;
bool friend operator <(Edge a,Edge b)
{
if(a.s==b.s)return a.e<b.e;
return a.s<b.s;
}
}bridge[maxn];
int n;
void init()
{
for(int i=0;i<=n;i++){
v[i].clear();
}
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(par,0,sizeof(0));
cnt=0;
}
void tarjan(int u,int fa)
{
dfn[u]=low[u]=++cnt;
par[u]=fa;
for(int i=0;i<v[u].size();i++){
int x=v[u][i];
if(!dfn[x]){
tarjan(x,u);
low[u]=min(low[u],low[x]);
}
else
if(fa!=x){
low[u]=min(low[u],dfn[x]);
}
}
}
void slove()
{
int ans=0;
for(int i=0;i<n;i++){//图不一定连通,要循环求tarjan
if(!dfn[i]){
tarjan(i,-1);
}
}
for(int i=0;i<n;i++){
int u=par[i];
int v=i;
if(u!=-1){
if(low[v]>dfn[u]){
bridge[ans].s=u;
bridge[ans].e=v;
if(bridge[ans].s>bridge[ans].e){
swap(bridge[ans].s,bridge[ans].e);
}
ans++;
}
}
}
sort(bridge,bridge+ans);
printf("%d critical links\n",ans);
for(int i=0;i<ans;i++){
printf("%d - %d\n",bridge[i].s,bridge[i].e);
}
printf("\n");
}
int main()
{
while(scanf("%d",&n)!=EOF){
init();
for(int i=0;i<n;i++){
int s,m;
scanf("%d (%d)",&s,&m);
while(m--){
int e;
scanf("%d",&e);
v[s].push_back(e);
v[e].push_back(s);
// printf("%d %d\n",s,e);
}
}
/* for(int i=0;i<n;i++){
for(int j=0;j<v[i].size();j++){
printf("%d %d\n",i,v[i][j]);
}
printf("\n");
}*/
slove();
}
return 0;
}
UVA - 796(求无向图中的桥)
最新推荐文章于 2021-03-17 19:06:12 发布
