• HLG 1494网络 (求的割点数目)可做模板


    网络
    Time Limit: 1000 MS Memory Limit: 65535 K
    Total Submit: 103(32 users) Total Accepted: 54(31 users) Rating: Special Judge: No
    Description
        一个电话公司建立了一个新的电话网,他们用1——N的整数标记了一些地方,每个地方有唯一的编号,网络中的每条电缆双向连接了两个地方,从每个地方可以通过电缆连接到任意其他的地方,因为它们之间不一定要有直接相连的电缆,可以通过其他的电缆间接连接,有的时候某个地方的电力可能会中断,从而导致这个地方无法被连接,电话公司意识到了某些地方的电力中断可能会导致其他地方也无法互相连接,把这些地方叫做关键点,所以他们决定写一个程序去找到这些地方。
    Input
        每组输入是一个电话网络,每组的第一行是一个整数N<100,表示电话网络连接了N个地点,接下来是不超过N行整数,每行表示第一个整数与后面的整数表示的地点之间有电缆直接相连,每组数据以0结束,输入也以0结束。
    Output
    输出关键点的数量
    Sample Input
    5
    5 1 2 3 4
    0
    6
    2 1 3
    5 4 6 2
    0
    0
    Sample Output
    1

    2

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #define N 110
    using namespace std;
    int dfn[N], low[N];
    bool mark[N], ans[N];
    bool edge[N][N];
    int cnt, son, n;
    int min(int a, int b)
    {
        return a < b ? a : b;
    }
    void unit()
    {
        memset(edge, 0, sizeof(edge));
        memset(mark, 0, sizeof(mark));
        memset(ans, 0, sizeof(ans));
        cnt=1; son=0;
        mark[1]=low[1]=dfn[1]=1;
    }
    
    void dfs(int u)
    {
        for(int v=1;v<=n;v++)
        {
            if(edge[u][v])
            {
                if(!mark[v])
                {
                    mark[v]=1;
                    dfn[v]=low[v]=++cnt;
                    dfs(v);
                    low[u]=min(low[u],low[v]);
                    if(low[v]>=dfn[u])
                    {
                        if(u!=1) ans[u]=1;
                        else son++;
                    }
                }
                else low[u]=min(low[u],dfn[v]);
            }
        }
        return ;
    }
    
    int main()
    {
        int i;
        char str[300];
        while(cin >> n)
        {
            if(n==0) break;
                getchar();
                unit();
            while(true)
            {
                gets(str);
                if(strcmp(str, "0")==0) break;
                int len=strlen(str);
                int num=0;
                for(i=0; str[i]>='0'&&str[i]<='9'; i++)
                num=num*10+str[i]-'0';
                for(;i<len; i++)
                {
                    int m=0;
                    for(;str[i]>='0'&&str[i]<='9'&&i<len; i++)
                    {
                        m=m*10+str[i]-'0';
                    }
                    if(m!=0) edge[num][m]=edge[m][num]=1;
                }
            }
            dfs(1);
            int js=0;
            for(int j=1; j<=n; j++)
                js+=ans[j];
            if(son>=2) cout << js+1 << endl;
            else cout << js << endl;
        }
        return 0;
    }
  • 相关阅读:
    2020杭电HDU-6863多校第八场Isomorphic Strings(Hash+学到的新东西)
    CodeForces 1395C-Boboniu and Bit Operations(位运算-暴力)
    洛谷P2585&ZJOI 2006-三色二叉树(树的染色-树形DP)
    洛谷P2016-战略游戏(树的最小点覆盖-树形DP)
    洛谷P2015-二叉苹果树(树形DP)
    洛谷P1352-没有上司的舞会(树形DP)
    CSUSTOJ 4004-你真的会吃零食吗?(打表)
    在线支付--支付宝
    使用rabbitmq rpc 模式
    在kubernetes 集群运行 odoo
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/4771698.html
Copyright © 2020-2023  润新知