SPF(强连通-求割点及对应的连通分量数)
judge:POJ 1523
Time Limit: 1000MS
Memory Limit: 10000K
source:Greater New York 2000
Description
Consider the two networks shown below. Assuming that data moves around these networks only between directly connected nodes on a peer-to-peer basis, a failure of a single node, 3, in
POJ 1523
Input
Output
Sample Input
1 2
5 4
3 1
3 2
3 4
3 5
0
1 2
2 3
3 4
4 5
5 1
0
1 2
2 3
3 4
4 6
6 3
2 5
5 1
0
0
Sample Output
Network #1
SPF node 3 leaves 2 subnets
Network #2
No SPF nodes
Network #3
SPF node 2 leaves 2 subnets
SPF node 3 leaves 2 subnets
题解
代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define _for(i, a) for(int i = 0; i < (a); i++)
#define _rep(i, a, b) for(int i = (a); i <= (b); i++)
#define mem(a, b) memset(a, b, sizeof(a))
#define maxn 1010
#define inf 0x3f3f3f3f
using namespace std;
struct edge {
int v, next;
}G[20005];
int head[maxn], cnt;
int dfn[maxn], low[maxn];
int root, root_son;
int tclock;
int cut[maxn];
int vis[maxn];
int n;
void add_edge(int u, int v) {
G[cnt].v = v;
G[cnt].next = head[u];
head[u] = cnt++;
}
void init() {
tclock = 0;
mem(head, -1);
cnt = 0;
mem(dfn, 0);
mem(low, 0);
root = 1;
root_son = 0;
mem(cut, 0);
mem(vis, 0);
n = 0;
}
void tarjan(int u) {
dfn[u] = low[u] = ++tclock;
for (int i = head[u]; i != -1; i = G[i].next) {
int v = G[i].v;
if (!dfn[v]) {
tarjan(v);
if (u == root) {
root_son++;
}
else {
if (low[u] > low[v]) {
low[u] = low[v];
}
if (low[v] >= dfn[u]) {
cut[u] = 1;
}
}
}
else if (low[u] > dfn[v]) {
low[u] = dfn[v];
}
}
}
void dfs(int u) {
vis[u] = 1;
for (int i = head[u]; i != -1; i = G[i].next) {
int v = G[i].v;
if (!vis[v]) {
vis[v] = 1;
dfs(v);
}
}
}
int main() {
//freopen("in.txt", "r", stdin);
int u, v;
int cas = 1;
while (scanf("%d", &u), u) {
init();
n = max(n, u);
scanf("%d", &v);
n = max(n, v);
add_edge(u, v);
add_edge(v, u);
while (scanf("%d", &u), u) {
n = max(n, u);
scanf("%d", &v);
n = max(n, v);
add_edge(u, v);
add_edge(v, u);
}
tarjan(root);
if (root_son > 1) {
cut[root] = 1;
}
printf("Network #%d\n", cas++);
bool f = 1;
_rep(i, 1, n) {
if (cut[i]) {
f = 0;
mem(vis, 0);
vis[i] = 1;
int son = 0;
for (int j = head[i]; j != -1; j = G[j].next) {
int v = G[j].v;
if (!vis[v]) {
dfs(v);
son++;
}
}
printf(" SPF node %d leaves %d subnets\n", i, son);
}
}
if (f) {
printf(" No SPF nodes\n");
}
printf("\n");
}
return 0;
}