partial Section 1.2 && poj 1253 3177
parent
456cd9529b
commit
8c247bdb18
@ -0,0 +1,60 @@
|
||||
#include <cstdio>
|
||||
#include <cctype>
|
||||
#include <cstring>
|
||||
#define clz(X) memset(X, 0, sizeof(X))
|
||||
inline int max(int a, int b) { return a > b ? a : b; }
|
||||
inline int min(int a, int b) { return a < b ? a : b; }
|
||||
inline void read(int &x)
|
||||
{
|
||||
int ch = x = 0;
|
||||
while (!isdigit(ch = getchar()));
|
||||
for (; isdigit(ch); ch = getchar())
|
||||
x = x * 10 + ch - '0';
|
||||
}
|
||||
int map[1010][1010], range;
|
||||
int dfn[1010], low[1010], idx;
|
||||
int son, subnet[1010];
|
||||
void tarjan(int u)
|
||||
{
|
||||
dfn[u] = low[u] = ++idx;
|
||||
for (int v = 1; v <= range; v++)
|
||||
if (map[u][v])
|
||||
if (!dfn[v])
|
||||
{
|
||||
tarjan(v);
|
||||
low[u] = min(low[u], low[v]);
|
||||
if (low[v] >= dfn[u])
|
||||
(u == 1 ? son : subnet[u])++;
|
||||
}
|
||||
else
|
||||
low[u] = min(low[u], dfn[v]);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int x, y, T = 0;
|
||||
while (read(x), x)
|
||||
{
|
||||
clz(map), clz(dfn), clz(low), clz(subnet), son = idx = 0;
|
||||
read(y);
|
||||
map[x][y] = map[y][x] = 1;
|
||||
range = max(x, y);
|
||||
while (read(x), x)
|
||||
{
|
||||
read(y);
|
||||
map[x][y] = map[y][x] = 1;
|
||||
range = max(range, max(x, y));
|
||||
}
|
||||
printf("Network #%d\n", ++T);
|
||||
tarjan(1);
|
||||
bool flag = false;
|
||||
if (son > 1) subnet[1] = son - 1;
|
||||
for (int i = 1; i <= range; i++)
|
||||
if (subnet[i])
|
||||
printf(" SPF node %d leaves %d subnets\n", i, subnet[i] + 1),
|
||||
flag = true;
|
||||
if (!flag)
|
||||
puts(" No SPF nodes");
|
||||
putchar('\n');
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,45 @@
|
||||
#include <cstdio>
|
||||
inline int min(int a, int b) { return a < b ? a : b; }
|
||||
int head[5010], to[20010], next[20010], ecnt, map[5010][5010];
|
||||
int dfn[5010], low[5010], idx, cnt[5010];
|
||||
void addEdge(int f, int t)
|
||||
{
|
||||
ecnt++;
|
||||
next[ecnt] = head[f];
|
||||
head[f] = ecnt;
|
||||
to[ecnt] = t;
|
||||
}
|
||||
void tarjan(int u, int p)
|
||||
{
|
||||
dfn[u] = low[u] = ++idx;
|
||||
for (int e = head[u]; e; e = next[e])
|
||||
if (!dfn[to[e]])
|
||||
tarjan(to[e], u), low[u] = min(low[u], low[to[e]]);
|
||||
else if (to[e] != p)
|
||||
low[u] = min(low[u], dfn[to[e]]);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n, m;
|
||||
scanf("%d%d", &n, &m);
|
||||
for (int i = 1, x, y; i <= m; i++)
|
||||
{
|
||||
scanf("%d%d", &x, &y);
|
||||
if (!map[x][y])
|
||||
{
|
||||
addEdge(x, y);
|
||||
addEdge(y, x);
|
||||
map[x][y] = map[y][x] = true;
|
||||
}
|
||||
}
|
||||
tarjan(1, 0);
|
||||
for (int i = 1; i <= n; i++)
|
||||
for (int e = head[i]; e; e = next[e])
|
||||
if (low[to[e]] != low[i])
|
||||
cnt[low[i]]++;
|
||||
int ans = 0;
|
||||
for (int i = 1; i <= n; i++)
|
||||
ans += cnt[i] == 1;
|
||||
printf("%d", (ans + 1) >> 1);
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,60 @@
|
||||
#include <cstdio>
|
||||
#include <cctype>
|
||||
#include <cstring>
|
||||
#define clz(X) memset(X, 0, sizeof(X))
|
||||
inline int max(int a, int b) { return a > b ? a : b; }
|
||||
inline int min(int a, int b) { return a < b ? a : b; }
|
||||
inline void read(int &x)
|
||||
{
|
||||
int ch = x = 0;
|
||||
while (!isdigit(ch = getchar()));
|
||||
for (; isdigit(ch); ch = getchar())
|
||||
x = x * 10 + ch - '0';
|
||||
}
|
||||
int map[1010][1010], range;
|
||||
int dfn[1010], low[1010], idx;
|
||||
int son, subnet[1010];
|
||||
void tarjan(int u)
|
||||
{
|
||||
dfn[u] = low[u] = ++idx;
|
||||
for (int v = 1; v <= range; v++)
|
||||
if (map[u][v])
|
||||
if (!dfn[v])
|
||||
{
|
||||
tarjan(v);
|
||||
low[u] = min(low[u], low[v]);
|
||||
if (low[v] >= dfn[u])
|
||||
(u == 1 ? son : subnet[u])++;
|
||||
}
|
||||
else
|
||||
low[u] = min(low[u], dfn[v]);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int x, y, T = 0;
|
||||
while (read(x), x)
|
||||
{
|
||||
clz(map), clz(dfn), clz(low), clz(subnet), son = idx = 0;
|
||||
read(y);
|
||||
map[x][y] = map[y][x] = 1;
|
||||
range = max(x, y);
|
||||
while (read(x), x)
|
||||
{
|
||||
read(y);
|
||||
map[x][y] = map[y][x] = 1;
|
||||
range = max(range, max(x, y));
|
||||
}
|
||||
printf("Network #%d\n", ++T);
|
||||
tarjan(1);
|
||||
bool flag = false;
|
||||
if (son > 1) subnet[1] = son - 1;
|
||||
for (int i = 1; i <= range; i++)
|
||||
if (subnet[i])
|
||||
printf(" SPF node %d leaves %d subnets\n", i, subnet[i] + 1),
|
||||
flag = true;
|
||||
if (!flag)
|
||||
puts(" No SPF nodes");
|
||||
putchar('\n');
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,45 @@
|
||||
#include <cstdio>
|
||||
inline int min(int a, int b) { return a < b ? a : b; }
|
||||
int head[5010], to[20010], next[20010], ecnt, map[5010][5010];
|
||||
int dfn[5010], low[5010], idx, cnt[5010];
|
||||
void addEdge(int f, int t)
|
||||
{
|
||||
ecnt++;
|
||||
next[ecnt] = head[f];
|
||||
head[f] = ecnt;
|
||||
to[ecnt] = t;
|
||||
}
|
||||
void tarjan(int u, int p)
|
||||
{
|
||||
dfn[u] = low[u] = ++idx;
|
||||
for (int e = head[u]; e; e = next[e])
|
||||
if (!dfn[to[e]])
|
||||
tarjan(to[e], u), low[u] = min(low[u], low[to[e]]);
|
||||
else if (to[e] != p)
|
||||
low[u] = min(low[u], dfn[to[e]]);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n, m;
|
||||
scanf("%d%d", &n, &m);
|
||||
for (int i = 1, x, y; i <= m; i++)
|
||||
{
|
||||
scanf("%d%d", &x, &y);
|
||||
if (!map[x][y])
|
||||
{
|
||||
addEdge(x, y);
|
||||
addEdge(y, x);
|
||||
map[x][y] = map[y][x] = true;
|
||||
}
|
||||
}
|
||||
tarjan(1, 0);
|
||||
for (int i = 1; i <= n; i++)
|
||||
for (int e = head[i]; e; e = next[e])
|
||||
if (low[to[e]] != low[i])
|
||||
cnt[low[i]]++;
|
||||
int ans = 0;
|
||||
for (int i = 1; i <= n; i++)
|
||||
ans += cnt[i] == 1;
|
||||
printf("%d", (ans + 1) >> 1);
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
void tarjan(int u, int p)
|
||||
{
|
||||
dfn[u] = low[u] = ++idx;
|
||||
for (int e = head[u]; e; e = next[e])
|
||||
if (!dfn[to[e]])
|
||||
tarjan(to[e], u), low[u] = min(low[u], low[to[e]]);
|
||||
else if (to[e] != p)
|
||||
low[u] = min(low[u], dfn[to[e]]);
|
||||
}
|
||||
Binary file not shown.
Loading…
Reference in new issue