★★ 输入文件:gd.in
输出文件:gd.out
简单对比
时间限制:1 s 内存限制:128 MB
输入文件名: gd.in
7
1 2
2 3
2 4
3 4
4 5
4 6
4 7
5 6
6 7
输出文件名:gd.out
2
2
4
Tarjan割点模板
1 #include<algorithm> 2 #include<cstring> 3 #include<cstdio> 4 #define N 1100 5 using namespace std; 6 int n,x,y,tim,tot=1,ans; 7 int dfn[N],low[N],head[N],cut_point[N]; 8 int read() 9 { 10 int x=0,f=1; char ch=getchar(); 11 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1; ch=getchar();} 12 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘; ch=getchar();} 13 return x*f; 14 } 15 struct Edge 16 { 17 int to,from,next; 18 }edge[N]; 19 int add(int x,int y) 20 { 21 tot++; 22 edge[tot].to=y; 23 edge[tot].next=head[x]; 24 head[x]=tot; 25 } 26 int tarjan(int now,int pre) 27 { 28 int sum=0;bool if_point=false; 29 dfn[now]=low[now]=++tim; 30 for(int i=head[now];i;i=edge[i].next) 31 { 32 int t=edge[i].to; 33 if((i^1)==pre) continue; 34 if(!dfn[t]) 35 { 36 sum++,tarjan(t,i); 37 low[now]=min(low[now],low[t]); 38 if(dfn[now]<=low[t]) if_point=true; 39 } 40 else low[now]=min(low[now],dfn[t]); 41 } 42 if(!pre){if(sum>1) ans++,cut_point[now]=true;} 43 else if(if_point) ans++,cut_point[now]=true; 44 } 45 int main() 46 { 47 freopen("gd.in","r",stdin); 48 freopen("gd.out","w",stdout); 49 50 n=read(); 51 while(scanf("%d%d",&x,&y)==2) 52 add(x,y),add(y,x); 53 for(int i=1;i<=n;i++) 54 if(!dfn[i]) tarjan(i,0); 55 printf("%d\n",ans); 56 for(int i=1;i<=n;i++) 57 if(cut_point[i]) printf("%d\n",i); 58 }
原文:http://www.cnblogs.com/Shy-key/p/7413721.html