https://vjudge.net/contest/411012#problem/B
这sb题真的就nm离谱
割点板子题,就是建图比较sb,具体看代码吧
#include <iostream> #include <vector> #include <cstring> #include <cstdio> #include <algorithm> #include <string> #include <set> using namespace std; typedef long long ll; const int maxn = 2e5+121; vector<int> G[maxn]; void add(int x,int y) { G[x].push_back(y); } int n; int dfn[maxn], low[maxn]; int cnt[maxn]; int df; string sn; int tarjan(int x){ dfn[x] = low[x] = ++df; int f = 0; for(int i=0;i<G[x].size();i++){ int p = G[x][i]; if(!dfn[p]){ tarjan(p); low[x] = min(low[x],low[p]); if(dfn[x] <= low[p]){ f++; if(x != 1 || f > 1){ cnt[x] = 1; } } } else{ low[x] = min(low[x],dfn[p]); } } return 0; } int main() { while(cin>>n && n) { for(int i=0; i<=n+11; i++) { G[i].clear(); dfn[i] = low[i] = 0; cnt[i] = 0; } df = 0; getchar(); while(1){ int f = 0; int ans = 0; int be; getline(cin,sn); if(sn == "0") break; for (int i = 0; i < sn.size(); i++) { if(sn[i] >= '0' && sn[i] <= '9') { ans *= 10; ans += sn[i] - '0'; } else { if(f == 0) { be = ans; f = 1; } else { add(be, ans); add(ans, be); } ans = 0; } } add(be,ans); add(ans,be); } tarjan(1); int ans = 0; for(int i=1;i<=n;i++){ if(cnt[i]) ans++; } cout<<ans<<endl; } return 0; }