http://hoj.twbbs.org.tw/judge/problem/view/143
找割點的數量
基本上和這題一樣,把找點改成記數。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #include <cstdlib> #include <iostream> #include <vector> #define N 50001 #define M 200001 #define MM MAP[now][i] using namespace std; vector<int>MAP[N]; int L[M],low[N],ti[N],t=0,sum=0; bool wed[N],IF[N]; int DFS(int now,int root) { ti[now]=t++; low[now]=ti[now]; wed[now]=true; int tmpr=0; for(int i=0;i<MAP[now].size();i++){ if(L[MM]!=0){ int tmp=L[MM]-now; L[MM]=0; if(!wed[tmp]){ tmpr++; DFS(tmp,root); low[now]=(low[now]<low[tmp])? low[now]:low[tmp]; }else{ low[now]=(low[now]<ti[tmp])? low[now]:ti[tmp]; } if(low[tmp]>=ti[now]&&now!=root)IF[now]=true; } } if(now==root&&tmpr>=2)sum++; return sum; } int main(int argc,char *argv[]) { int n,m; cin>>n>>m; for(int i=0;i<m;i++){ int a,b; cin>>a>>b; L[i]=a+b; MAP[a].push_back(i); MAP[b].push_back(i); } for(int i=1;i<=n;i++) if(!wed[i])DFS(i,i); for(int i=1;i<=n;i++)if(IF[i])sum++; cout<<sum<<endl; return 0; }
|