ACM模板库

ACM模板库


求去掉每一个割点后连通块数量

<pre><code class="language-cpp">#include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;vector&gt; #include&lt;algorithm&gt; using namespace std; const int maxn=300000+5; int n,m; vector&lt;int&gt; G[maxn]; int cut[maxn]; int low[maxn]; int pre[maxn]; int dfs_clock; int tarjan(int u,int fa) { int lowu= pre[u]=++dfs_clock; for(int i=0;i&lt;G[u].size();i++) { int v=G[u][i]; if(!pre[v]) { int lowv=tarjan(v,u); lowu=min(lowv,lowu); if(lowv&gt;=pre[u]) cut[u]++; } else if(pre[v]&lt;pre[u] &amp;&amp; v!=fa) lowu = min(lowu,pre[v]); } return low[u]=lowu; } int main() { // while(scanf("%d%d",&amp;n,&amp;m)==2&amp;&amp;n) // { scanf("%d%d",&amp;n,&amp;m); dfs_clock=0; memset(cut,0,sizeof(cut)); memset(pre,0,sizeof(pre)); for(int i=1;i&lt;=n;i++) G[i].clear(); for(int i=1;i&lt;=m;i++) { int u,v; scanf("%d%d",&amp;u,&amp;v); G[u].push_back(v); G[v].push_back(u); } int sum=0;//计数连通分量数目 int max_cut=-10000; for(int i=1;i&lt;=n;i++)if(!pre[i]) { sum++; tarjan(i,-1); cut[i]--; } for(int i=1;i&lt;=n;i++){ printf("%d ", cut[i]+sum); } // max_cut=max(max_cut,cut[i]); // printf("%d\n",sum+max_cut); // } return 0; }</code></pre>

页面列表

ITEM_HTML