题目链接:http://poj.org/problem?id=1144
题意:给你一个图 求这个图上的割点的个数
代码:
//#include <bits/stdc++.h>
#include <vector>
#include <cstdio>
#include <cstring>
#define sf scanf
#define pf printf
using namespace std;
const int maxn = 100 + 5;
vector<int> Adj[maxn];
int dfn[maxn],low[maxn],TOT;
int CV_CNT;
void DFS(int u,int fa){
dfn[u] = low[u] = TOT++;
int ch_cnt = 0,len = Adj[u].size(),v,f = 0;
for(int i = 0;i < len;++i){
v = Adj[u][i];if(v == fa) continue;
if(dfn[v] == -1){
DFS(v,u);low[u] = min(low[u],low[v]);
if(dfn[u] <= low[v]) f = 1;
ch_cnt++;
}else low[u] = min(low[u],dfn[v]);
}
if(fa == 0 && ch_cnt > 1) CV_CNT++;
if(fa != 0 && f) CV_CNT++;
}
int main(){
int n;
while(~sf("%d",&n) && n){
memset(dfn,-1,sizeof dfn);
for(int i = 1;i <= n;++i) Adj[i].clear();
CV_CNT = TOT = 0;
int x,y;getchar();
while(sf("%d",&x) && x){
while(getchar() != '\n'){
sf("%d",&y);
Adj[x].push_back(y),Adj[y].push_back(x);
}
}
for(int i = 1;i <= n;++i)
if(dfn[i] == -1) DFS(i,0);
pf("%d\n",CV_CNT);
}
}