图中有多少个割点 ,且每个割点能把改图分成几个点连通分量。(这里一定要注意输出的格式)
#include<iostream>
#include <vector>
using namespace std;
vector<int>G[1005];
int low[1005], num[1005];
bool judge[1005];
int getpow[1005];
int dfn = 0, Max;
void dfs(int u,int fa) {
low[u] = num[u] = ++dfn;
int child = 0;
int sum = 0;
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if (!num[v]) {
child++;
dfs(v, u);
low[u] = min(low[u], low[v]);
if (num[u] <= low[v]) {
if (u != 1)
judge[u] = true;
sum++;
}
}
else if (num[u] > num[v] && v != fa)
low[u] = min(low[u], num[v]);
}
if (u != 1 && sum != 0)
getpow[u] = sum + 1;
if (u == 1 && child >= 2) {
judge[u] = true;
getpow[1] = sum;
}
}
int main() {
int from, to, flag, k = 1;
while (cin >> flag) {
Max = -1;
if (flag == 0)
return 0;
else {
for (int i = 0; i < 1005; i++)
G[i].clear();
memset(low, 0, sizeof(low));
memset(num, 0, sizeof(num));
memset(judge, false, sizeof(judge));
memset(getpow, 0, sizeof(getpow));
dfn = 0;
while (flag != 0) {
from = flag;
cin >> to;
G[from].push_back(to);
G[to].push_back(from);
from = max(from, to);
Max = max(Max, from);
cin >> flag;
}
dfs(1, -1);
cout << "Network #" << k << endl;
for (int i = 1; i <= Max; i++) {
if (getpow[i]) {
cout << " SPF node " << i << " leaves " << getpow[i] << " stubnets" << endl;
flag = 1;
}
}
if (flag == 0)
cout << " No SPF nodes" << endl;
cout << endl;
k++;
}
}
system("pause");
return 0;
}