範例程式碼 uva315
//uva315
#include <iostream>
#include <vector>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 100;
vector<int> a[N];
bool flag[N], ap[N];
int d[N], low[N];
int n, c, subtree;
void DFS(int u) {
flag[u] = true;
low[u] = d[u] = ++c;
for (vector<int>::iterator it = a[u].begin(); it != a[u].end(); ++it) {
if (!flag[*it]) {
DFS(*it);
low[u] = min(low[u], low[*it]);
if (low[*it] >= d[u]) {
if (u != 0)
ap[u] = true;
else subtree++;
}
}
else low[u] = min(low[u], d[*it]);
}
}
bool g[N][N];
char buf[1000], t[100];
int main() {
int i, j, x, y;
while (scanf("%d", &n), n) {
memset(g, 0, sizeof(g));
while (scanf("%d", &x), x) {
gets(buf);
for (i = 0; buf[i] == ' '; i++);
for (; buf[i]; i += j + 1) {
for (j = 0; buf[i + j] && buf[i + j] != ' '; j++);
strncpy(t, buf + i, j);
t[j] = '\0';
y = atoi(t);
g[x - 1][y - 1] = g[y - 1][x - 1] = true;
if (buf[i + j] == '\0') break;
}
}
for (i = 0; i < n; i++) {
a[i].clear();
for (j = 0; j < n; j++)
if (g[i][j]) a[i].push_back(j);
}
memset(flag, 0, sizeof(flag));
memset(ap, 0, sizeof(ap));
subtree = 0;
c = 0;
DFS(0);
if (subtree > 1) ap[0] = true;
int sum = 0;
for (i = 0; i < n; i++)
if (ap[i]) sum++;
printf("%d\n", sum);
}
return 0;
}