Network
possible to reach through lines every other place, however it need not be a direct connection, it can go through several exchanges. From time to time the power supply fails at a place and then the exchange does not operate. The officials from TLC realized that in such a case it can happen that besides the fact that the place with the failure is unreachable, this can also cause that some other places cannot connect to each other. In such a case we will say the place (where the failure
occured) is critical. Now the officials are trying to write a program for finding the number of all such critical places. Help them.
by one space. Each block ends with a line containing just 0. The last block has only one line with N = 0;
5 5 1 2 3 4 0 6 2 1 3 5 4 6 2 0 0Sample Output
1 2Hint
點u是割點的充分條件:
1. 如果u是dfs樹的根,則u至少有兩個子女。
2. 如果u不是dfs樹的根,則它至少有一個子女w,從w出發,不可能通過和w、w的子孫相連的回邊到達u的祖先。
/* POJ 1144*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<cmath>
#include<string>
#include<queue>
#include<vector>
#include<stack>
#include<list>
#include<set>
#define manx maxn
const int maxn = 100 +10;
using namespace std;
int times,roots,cnt;
int Next[maxn*200],To[maxn*200],Lext[maxn],vis[manx],dis[manx];
int dfn[manx],low[manx];
void init()
{
times=roots=cnt=0;
memset(Next,0,sizeof(Next));
memset(Lext,0,sizeof(Lext));
memset(To,0,sizeof(To));
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
}
void add(int u,int v)
{
Next[++cnt]=Lext[u];
To[cnt]=v;
Lext[u]=cnt;
}
int dfs(int u)
{
int cntn=0;
dfn[u]=low[u]=++times;
vis[u]=1;
for(int i=Lext[u]; i; i=Next[i])
{
int v=To[i];
if(!dfn[v])
{
cntn++;
dfs(v);
low[u]=min(low[u],low[v]);
if(u==roots&&cntn==2)
dis[u]=1;
if(u!=roots&&low[v]>=dfn[u])
dis[u]=1;
}
else if(vis[v])//這裏的意思 就是v點已經訪問了 v點是u點的祖先 及v到u有回邊
{
low[u]=min(low[u],dfn[v]);
}
}
}
int main()
{
int n;
while(scanf("%d",&n)==1&&n)
{
int a,b;
int i,ans=0;
char c;
init();
while(scanf("%d",&a)==1&&a)
{
while((c=getchar())!='\n')
{
scanf("%d",&b);
add(a,b);
add(b,a);
}
}//這裏懵了好久 輸入有點坑
times=0;
roots=1;
dfs(roots);
for(i=1; i<=n; i++)
if(dis[i])ans++;
printf("%d\n",ans);
}
return 0;
}