zoukankan      html  css  js  c++  java
  • tarjan算法求割点cojs 8

    tarjan求割点:cojs 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

     1 #include<iostream>
     2 using namespace std;
     3 #include<cstdio>
     4 #include<cstring>
     5 #define N 102
     6 int low[N],dfn[N],root,topt=0,n,a,b,ans[N];
     7 bool is_gd[N];
     8 struct Edge{
     9     int v,last;
    10 }edge[N*N*2];
    11 int head[N],t=0;
    12 void add_edge(int u,int v)
    13 {
    14     ++t;
    15     edge[t].v=v;
    16     edge[t].last=head[u];
    17     head[u]=t;
    18 }
    19 void input()
    20 {
    21     scanf("%d",&n);
    22     while(scanf("%d%d",&a,&b)==2)
    23     {
    24         add_edge(a,b);
    25         add_edge(b,a);
    26     }
    27 }
    28 void tarjan(int k)
    29 {/*记住这个模板就好了*/
    30     int cnt=0;
    31     dfn[k]=low[k]=++topt;
    32     for(int l=head[k];l;l=edge[l].last)
    33     {
    34         int v=edge[l].v;
    35         if(!dfn[v])
    36         {
    37             tarjan(v);
    38             ++cnt;
    39             low[k]=min(low[k],low[v]);
    40             if((root==k&&cnt>1)||(root!=k&&low[v]>=dfn[k]))
    41               is_gd[k]=true;
    42         }
    43         else low[k]=min(low[k],dfn[v]);
    44     }
    45 }
    46 int main()
    47 {
    48     freopen("gd.in","r",stdin);
    49     freopen("gd.out","w",stdout);
    50     input();
    51     root=1;
    52     tarjan(1);
    53     for(int i=1;i<=n;++i)
    54       if(is_gd[i])
    55       ans[++ans[0]]=i;
    56     printf("%d
    ",ans[0]);
    57     for(int i=1;i<=ans[0];++i)
    58       printf("%d
    ",ans[i]);
    59     fclose(stdin);fclose(stdout);
    60     return 0;
    61 }
  • 相关阅读:
    winfrom 对话框
    容器控件
    简单记事本整理
    公共控件
    winfrom。布局
    ado 小测试
    ado.not--更改精简练习
    ado.not--数据库防字符串注入攻击学习及 练习
    ado.not--练习题
    ado.not--添加练习题
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5564996.html
Copyright © 2011-2022 走看看