备用交换机
★★ 输入文件:gd.in
输出文件:gd.out
简单对比
时间限制:1 s 内存限制:128 MB
- 【问题描述】
n个城市之间有通讯网络,每个城市都有通讯交换机,直接或间接与其它城市连接。因电子设备容易损坏,需给通讯点配备备用交换机。但备用交换机数量有限,不能全部配备,只能给部分重要城市配置。于是规定:如果某个城市由于交换机损坏,不仅本城市通讯中断,还造成其它城市通讯中断,则配备备用交换机。请你根据城市线路情况,计算需配备备用交换机的城市个数,及需配备备用交换机城市的编号。
【输入格式】
输入文件有若干行
第一行,一个整数n,表示共有n个城市(2<=n<=100)
下面有若干行,每行2个数a、b,a、b是城市编号,表示a与b之间有直接通讯线路。
【输出格式】
输出文件有若干行
第一行,1个整数m,表示需m个备用交换机,下面有m行,每行有一个整数,表示需配备交换机的城市编号,输出顺序按编号由小到大。如果没有城市需配备备用交换机则输出0。
【输入输出样例】
输入文件名: gd.in
7
1 2
2 3
2 4
3 4
4 5
4 6
4 7
5 6
6 7
输出文件名:gd.out
2
2
4
割点
注意读入道路数量不等于n
1 /*by SilverN*/ 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 const int mxn=20000; 10 const int mxm=120; 11 vector<int>e[mxn]; 12 int gd[mxm]; 13 int n; 14 int root,dtime=0; 15 int dfn[mxm],low[mxm]; 16 int ans=0; 17 18 void add_edge(int u,int v){ 19 e[u].push_back(v); 20 e[v].push_back(u); 21 return; 22 } 23 void tarjan(int u){ 24 int i; 25 int tot=0; 26 low[u]=dfn[u]=++dtime; 27 int v; 28 for(i=0;i<e[u].size();i++){ 29 v=e[u][i]; 30 if(!dfn[v]){ 31 tarjan(v); 32 ++tot; 33 low[u]=min(low[v],low[u]); 34 if((u==root && tot>1)||(u!=root && low[v]>=dfn[u])) 35 if(!gd[u]) gd[u]=true,ans++; 36 } 37 else low[u]=min(low[u],dfn[v]); 38 } 39 return; 40 } 41 int main(){ 42 freopen("gd.in","r",stdin); 43 freopen("gd.out","w",stdout); 44 scanf("%d",&n); 45 int i,j; 46 int a,b; 47 while(scanf("%d%d",&a,&b)!=EOF) 48 add_edge(a,b); 49 for(i=1;i<=n;i++){ 50 if(!dfn[i]){ 51 root=i; 52 tarjan(i); 53 } 54 } 55 printf("%d\n",ans); 56 for(i=1;i<=n;i++){ 57 if(gd[i])printf("%d\n",i); 58 } 59 return 0; 60 }
时间: 2024-12-12 13:24:52