COGS——T 8. 备用交换机
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了COGS——T 8. 备用交换机相关的知识,希望对你有一定的参考价值。
http://www.cogs.pro/cogs/problem/problem.php?pid=8
★★ 输入文件:gd.in
输出文件:gd.out
简单对比
时间限制:1 s 内存限制:128 MB
- 【问题描述】
n个城市之间有通讯网络,每个城市都有通讯交换机,直接或间接与其它城市连接。因电子设备容易损坏,需给通讯点配备备用交换机。但备用交换机数量有限,不能全部配备,只能给部分重要城市配置。于是规定:如果某个城市由于交换机损坏,不仅本城市通讯中断,还造成其它城市通讯中断,则配备备用交换机。请你根据城市线路情况,计算需配备备用交换机的城市个数,及需配备备用交换机城市的编号。
【输入格式】
输入文件有若干行
第一行,一个整数n,表示共有n个城市(2<=n<=100)
下面有若干行,每行2个数a、b,a、b是城市编号,表示a与b之间有直接通讯线路。
第一行,一个整数n,表示共有n个城市(2<=n<=100)
下面有若干行,每行2个数a、b,a、b是城市编号,表示a与b之间有直接通讯线路。
【输出格式】
输出文件有若干行
第一行,1个整数m,表示需m个备用交换机,下面有m行,每行有一个整数,表示需配备交换机的城市编号,输出顺序按编号由小到大。如果没有城市需配备备用交换机则输出0。
第一行,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
Tarjan割点模板
1 #include<algorithm> 2 #include<cstring> 3 #include<cstdio> 4 #define N 1100 5 using namespace std; 6 int n,x,y,tim,tot=1,ans; 7 int dfn[N],low[N],head[N],cut_point[N]; 8 int read() 9 { 10 int x=0,f=1; char ch=getchar(); 11 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1; ch=getchar();} 12 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘; ch=getchar();} 13 return x*f; 14 } 15 struct Edge 16 { 17 int to,from,next; 18 }edge[N]; 19 int add(int x,int y) 20 { 21 tot++; 22 edge[tot].to=y; 23 edge[tot].next=head[x]; 24 head[x]=tot; 25 } 26 int tarjan(int now,int pre) 27 { 28 int sum=0;bool if_point=false; 29 dfn[now]=low[now]=++tim; 30 for(int i=head[now];i;i=edge[i].next) 31 { 32 int t=edge[i].to; 33 if((i^1)==pre) continue; 34 if(!dfn[t]) 35 { 36 sum++,tarjan(t,i); 37 low[now]=min(low[now],low[t]); 38 if(dfn[now]<=low[t]) if_point=true; 39 } 40 else low[now]=min(low[now],dfn[t]); 41 } 42 if(!pre){if(sum>1) ans++,cut_point[now]=true;} 43 else if(if_point) ans++,cut_point[now]=true; 44 } 45 int main() 46 { 47 freopen("gd.in","r",stdin); 48 freopen("gd.out","w",stdout); 49 50 n=read(); 51 while(scanf("%d%d",&x,&y)==2) 52 add(x,y),add(y,x); 53 for(int i=1;i<=n;i++) 54 if(!dfn[i]) tarjan(i,0); 55 printf("%d\n",ans); 56 for(int i=1;i<=n;i++) 57 if(cut_point[i]) printf("%d\n",i); 58 }
以上是关于COGS——T 8. 备用交换机的主要内容,如果未能解决你的问题,请参考以下文章