标签:vc LOJ 割点 break int maxn c2 include 10100
题目链接:传送门
思路:
就是求割点的个数,直接Tarjan算法就行。
注意输入格式(判断比较水)。
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<string> #include<stack> #include<algorithm> using namespace std; const int maxn = 550; int num[maxn],low[maxn],vis[maxn],gedian[maxn],tim,cnt,root; vector <int> vc[maxn]; int MIN(int x,int y) { return x<y?x:y; } void Init() { memset(num,0,sizeof(num)); memset(low,0,sizeof(low)); memset(vis,0,sizeof(vis)); memset(gedian,0,sizeof(gedian)); for(int i=0;i<maxn;i++) vc[i].clear(); tim=0;cnt=0; } void Tarjan(int u,int pre) { low[u]=num[u]=++tim; vis[u]=1; int v,i,tt=0; for(i=0;i<vc[u].size();i++){ v=vc[u][i]; if(!vis[v]){ tt++; Tarjan(v,u); low[u]=MIN(low[u],low[v]); if((u==root&&tt>1)||(u!=root&&num[u]<=low[v])) gedian[u]=1; } else low[u]=MIN(low[u],num[v]); } } int main(void) { int n,m,i,j,x,y; char ch; string str; while(~scanf("%d",&n)&&n){ Init(); int c1=0,c2; while(scanf("%d",&x)&&x){ if(c1>=n) break;c1++; c2=0; while(1){ c2++; scanf("%d",&y); vc[x].push_back(y); vc[y].push_back(x); if(c2>=n) break; ch=getchar(); if(ch=='\n') break; } } for(i=1;i<=n;i++) if(vis[i]==0){ root=i; Tarjan(i,-1); } for(i=1;i<=n;i++) if(gedian[i]==1) cnt++; printf("%d\n",cnt); } return 0; }View Code
标签:vc,LOJ,割点,break,int,maxn,c2,include,10100 来源: https://www.cnblogs.com/2018zxy/p/10359296.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。