Vice
City is built over a group of islands, with bridges connecting them. As anyone
in 
Input. Consist of a series of test cases. Each test case will
start with the number n (1 ≤ n ≤ 104) of islands,
and the number m of bridges (1
≤ m ≤ 105).
Following there will be m lines each
describing a bridge. Each of these m
lines will contain two integers ui,
vi (1 ≤ ui, vi ≤ n),
indicating that there is a bridge connecting islands ui and vi.
The input ends with a case where n = m = 0.
Output. For each case on the input you must print a line
indicating the number of islands that, when submerged, will disconnect parts of
the city.
| Sample Input | Sample Output | 
| 3 3 1 2 2 3 1 3 6 8 1 3 6 1 6 3 4 1 6 4 5 2 3 2 3 5 0 0 | 0 1 | 
ãðàôû – òî÷êè ñî÷ëåíåíèÿ
 çàäàííîì
ãðàôå ñëåäóåò íàéòè êîëè÷åñòâî òî÷åê ñî÷ëåíåíèÿ.
Ðåàëèçàöèÿ
àëãîðèòìà
#include <cstdio>
#include <vector>
#include <set>
#include <cstring>
#define MAX 10010
using namespace
std;
vector<int> graph[MAX];
int used[MAX], d[MAX], up[MAX];
int i, n, m, a, b, time;
set<int> ArtPoints;
set<int>::iterator
iter;
void dfs (int
v, int p = -1)
{
  int i, to, children;
  used[v] = 1;
  d[v] = up[v] =
time++;
  children = 0;
  for (i = 0; i < graph[v].size(); i++) 
  {
    to = graph[v][i];
    if (to == p)  continue;
    if (used[to])
      up[v] = min
(up[v], d[to]);
    else 
    {
      dfs (to, v);
      up[v] = min
(up[v], up[to]);
      if ((up[to] >= d[v]) && (p != -1))
ArtPoints.insert(v);
      children++;
    }
  }
  if ((p == -1) && (children > 1))
ArtPoints.insert(v);
}
int main(void)
{ 
  while(scanf("%d
%d",&n,&m), n + m)
  {
    for(i = 0; i <= n; i++) graph[i].clear();
    memset(used,0,sizeof(used));
    memset(d,0,sizeof(d));
    memset(up,0,sizeof(up));
    ArtPoints.clear();
    for(i = 0; i < m; i++)
    {
      scanf("%d %d",&a,&b);
      graph[a].push_back(b);
graph[b].push_back(a);
    }
    time = 1;
    for(i = 1; i <= n; i++)
      if (!used[i]) dfs(i);
    printf("%d\n",ArtPoints.size());
  }
  return 0;
}