求助 去重边后依然不对
查看原帖
求助 去重边后依然不对
246331
mystic_qwq楼主2024/4/6 15:27

Still WA#9 求大佬看看

之前的代码

//add n edges to make it double-connect
#include<bits/stdc++.h>
using namespace std;
const int N=5e3+1;
vector<int>G[N],low(N),dfn(N),f(N);
int cnt,idx; stack<int>st;
void dfs(int u,int fa){
  dfn[u]=low[u]=++cnt,st.push(u);
  for(auto v:G[u])
    if(!dfn[v]) dfs(v,u),low[u]=min(low[u],low[v]);
    else if(dfn[v]<dfn[u]&&v!=fa) low[u]=min(low[u],dfn[v]);
  if(low[u]==dfn[u]){
    int v;++idx;
    do f[v=st.top()]=idx,st.pop();while(v!=u);
  }
}
void add(int u,int v){
  G[u].push_back(v);
  G[v].push_back(u);
}
main(){
  cin.tie(0)->sync_with_stdio(0);
  int n,m;
  cin>>n>>m;
  vector<pair<int,int>>ad;
  for(int u,v;m--;){
    cin>>u>>v; if(u>v)swap(u,v);
    ad.push_back({u,v});
  }
  sort(ad.begin(),ad.end());
  unique(ad.begin(),ad.end());
  for(auto[u,v]:ad) add(u,v);
  dfs(1,0); vector<int>deg(n+1);
  for(int u=1;u<=n;++u)
    for(int v:G[u])
      if(u<v&&f[u]!=f[v]) ++deg[f[u]],++deg[f[v]];
  int ans=count_if(deg.begin()+1,deg.begin()+idx+1,[](int x){return x==1;});
  cout<<(ans+1)/2;
}
2024/4/6 15:27
加载中...