桥和割点例题+讲解:hihocoder1183 http://hihocoder.com/problemset/problem/1183
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 #include<set> 6 using namespace std; 7 const int maxn=1005; 8 const int maxm=200010; 9 struct edge{ 10 int to,nxt; 11 bool cut; 12 }edge[maxm*2]; 13 int head[maxn],tot; 14 int low[maxn],dfn[maxn]; 15 int index,n,bridge; 16 set<int>st; 17 bool cut[maxn]; 18 19 void addedge(int u,int v) 20 { 21 edge[tot].to=v; 22 edge[tot].nxt=head[u]; 23 edge[tot].cut=false; 24 head[u]=tot++; 25 } 26 27 void tarjan(int u,int pre) 28 { 29 low[u]=dfn[u]=++index; 30 int son=0; 31 for ( int i=head[u];i!=-1;i=edge[i].nxt ) { 32 int v=edge[i].to; 33 if ( v==pre ) continue; 34 if ( !dfn[v] ) { 35 son++; 36 tarjan(v,u); 37 low[u]=min(low[u],low[v]); 38 if ( low[v]>dfn[u] ) { 39 bridge++; 40 edge[i].cut=true; 41 edge[i^1].cut=true; 42 } 43 if ( low[v]>=dfn[u] && u!=pre ) { 44 st.insert(u); 45 cut[u]=true; 46 } 47 } 48 else if ( low[u]>dfn[v] ) low[u]=dfn[v]; 49 } 50 if ( u==pre && son>1 ) { 51 cut[u]=true; 52 st.insert(u); 53 } 54 } 55 56 void solve() 57 { 58 memset(low,0,sizeof(low)); 59 memset(dfn,0,sizeof(dfn)); 60 memset(cut,false,sizeof(cut)); 61 index=bridge=0; 62 st.clear(); 63 for ( int i=1;i<=n;i++ ) { 64 if ( !dfn[i] ) tarjan(i,i); 65 } 66 set<int>::iterator it; 67 if ( st.size()==0 ) printf("Null\n"); 68 else { 69 for ( it=st.begin();it!=st.end();it++ ) { 70 if ( it!=st.begin() ) printf(" "); 71 printf("%d",*it); 72 } 73 printf("\n"); 74 } 75 vector<pair<int,int> >ans; 76 for ( int i=1;i<=n;i++ ) { 77 for ( int j=head[i];j!=-1;j=edge[j].nxt ) { 78 if ( edge[j].cut && edge[j].to>i ) ans.push_back(make_pair(i,edge[j].to)); 79 } 80 } 81 sort(ans.begin(),ans.end()); 82 for ( int i=0;i<ans.size();i++ ) { 83 printf("%d %d\n",ans[i].first,ans[i].second); 84 } 85 } 86 87 void init() 88 { 89 tot=0; 90 memset(head,-1,sizeof(head)); 91 } 92 93 int main() 94 { 95 int m,i,j,k,x,y,z; 96 while ( scanf("%d%d",&n,&m)!=EOF ) { 97 init(); 98 while ( m-- ) { 99 scanf("%d%d",&x,&y); 100 addedge(x,y); 101 addedge(y,x); 102 } 103 solve(); 104 } 105 }