zoukankan      html  css  js  c++  java
  • 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之间有直接通讯线路。
    【输出格式】
    输出文件有若干行
    第一行,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
    ",ans);
    56     for(int i=1;i<=n;i++)
    57      if(cut_point[i]) printf("%d
    ",i);
    58 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    (转)Hadoop MapReduce链式实践--ChainReducer
    (转)Permission denied: win7下面eclipse上传本地文件到DFS && 运行M/R程序时出现的同样的错误解决方法
    为什么需要注册OCX控件?
    WPF插件开发:使用FrameworkElementAdapters时VS报错的问题
    C# semphore的使用
    C# int可以表示的最大值
    WCF客户端从服务器下载数据
    C# 读取WAV文件(详细)
    C#读取wav文件
    VEMap.DeleteAllShapeLayers 方法
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7413721.html
Copyright © 2011-2022 走看看