#include<vector> #include<algorithm> #define N 1005 struct edge{ int u,v; bool is_bridge; edge(int u=0,int v=0):u(u),v(v),is_bridge(0){} }; std::vector<edge> E; std::vector<int> G[N];// 1-base int low[N],vis[N],Time,bridge_cnt; inline void add_edge(int u,int v){ G[u].push_back(E.size()); E.push_back(edge(u,v)); G[v].push_back(E.size()); E.push_back(edge(v,u)); } void dfs(int u,int re=-1){//u當前點,re為u連接前一個點的邊 int v; low[u]=vis[u]=++Time; st[top++]=u; for(size_t i=0;i<G[u].size();++i){ int e=G[u][i];v=E[e].v; if(!vis[v]){ dfs(v,e^1);//e^1反向邊 low[u]=std::min(low[u],low[v]); if(vis[u]<low[v]){ E[e].is_bridge=E[e^1].is_bridge=1; ++bridge_cnt; } }else if(vis[v]<vis[u]&&e!=re) low[u]=std::min(low[u],vis[v]); } }