备用交换机 题解
This post is written in Chinese. Please consider using Google Translate
求无向连通图的割顶,直接DFS求出,按顺序输出即可。
/*
* Problem: 备用交换机 gd
* Author: Guo Jiabao
* Time: 2009.4.7 15:43
* State: Solved
* Memo: 求割顶
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
const int MAXN=101;
using namespace std;
struct edge
{
edge *next;
int t;
};
edge *V[MAXN];
int N,D,DFS[MAXN],LOW[MAXN],PAR[MAXN];
bool isgd[MAXN];
inline void addedge(int a,int b)
{
edge e={V[a],b};
V[a]=new edge(e);
}
void init()
{
int a,b;
freopen("gd.in","r",stdin);
freopen("gd.out","w",stdout);
scanf("%d",&N);
while (scanf("%d%d",&a,&b)!=EOF)
{
addedge(a,b);
addedge(b,a);
}
}
void dfs(int u,int p)
{
DFS[u]=LOW[u]=++D;
PAR[u]=p;
for (edge *k=V[u];k;k=k->next)
{
int v=k->t;
if (!DFS[v]) //树枝边
{
dfs(v,u);
if (LOW[v]<LOW[u])
LOW[u]=LOW[v];
}
else if (v!=p && DFS[v]<LOW[u]) //后向边
LOW[u]=DFS[v];
}
}
void solve()
{
int i,u,v,rc=0,gdc=0;
dfs(1,0);
for (v=2;v<=N;v++)
{
u=PAR[v];
if (u==1)
rc++;
else if (DFS[u]<=LOW[v])
isgd[u]=true;
}
if (rc>=2)
isgd[1]=true;
for (i=1;i<=N;i++)
if (isgd[i])
gdc++;
printf("%dn",gdc);
for (i=1;i<=N;i++)
if (isgd[i])
printf("%dn",i);
}
int main()
{
init();
solve();
return 0;
}
<div class="MainText">
<div><a href="http://www.ruvtex.cn/cogs/problem/pdetail.php?pid=8" target="_blank">http://www.ruvtex.cn/cogs/problem/pdetail.php?pid=8</a></div>
<div><strong>备用交换机</strong></div>
<div><strong>问题描述</strong></div>
<div>n个城市之间有通讯网络,每个城市都有通讯交换机,直接或间接与其它城市连接。因电子设备容易损坏,需给通讯点配备备用交换机。但备用 交换机数量有限,不能全部配备,只能给部分重要城市配置。于是规定:如果某个城市由于交换机损坏,不仅本城市通讯中断,还造成其它城市通讯中断,则配备备 用交换机。请你根据城市线路情况,计算需配备备用交换机的城市个数,及需配备备用交换机城市的编号。</div>
<div>【输入格式】</div>
<div>输入文件有若干行<br />
第一行,一个整数n,表示共有n个城市(2<=n<=100)<br />
下面有若干行,每行2个数a、b,a、b是城市编号,表示a与b之间有直接通讯线路。</div>
<div>【输出格式】</div>
<div>输出文件有若干行<br />
第一行,1个整数m,表示需m个备用交换机,下面有m行,每行有一个整数,表示需配备交换机的城市编号,<span>输出顺序按编号由小到大。如果没有城市需配备备用交换机则输出0。</span></div>
<div>【输入输出样例】</div>
<div>输入文件名: gd.in</div>
<div>7<br />
1 2<br />
2 3<br />
2 4<br />
3 4<br />
4 5<br />
4 6<br />
4 7<br />
5 6<br />
6 7</div>
<div>输出文件名:<span>gd.out</span></div>
<div>2<br />
2<br />
4</div>
</div>