zoukankan      html  css  js  c++  java
  • hihocoder1183 连通性一·割边与割点

    输入

    第1行:2个正整数,N,M。表示点的数量N,边的数量M。1≤N≤20,000, 1≤M≤100,000

    第2..M+1行:2个正整数,u,v。表示存在一条边(u,v),连接了u,v两台服务器。1≤u<v≤N

    保证输入所有点之间至少有一条连通路径。

    输出

    第1行:若干整数,用空格隔开,表示满足要求的服务器编号。从小到大排列。若没有满足要求的点,该行输出Null

    第2..k行:每行2个整数,(u,v)表示满足要求的边,u<v。所有边根据u的大小排序,u小的排在前,当u相同时,v小的排在前面。若没有满足要求的边,则不输出

    /* ***********************************************
    Author        :devil
    Created Time  :2016/6/9 14:8:23
    ************************************************ */
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <cmath>
    #include <stdlib.h>
    using namespace std;
    const int N=20010;
    int dfn[N],low[N],f[N],cou=1;
    vector<int>eg[N];
    vector<int>point;
    vector<pair<int,int> >edge;
    void dfs(int u)
    {
        bool add=0;
        int child=0;
        dfn[u]=low[u]=cou++;
        for(int i=0;i<eg[u].size();i++)
        {
            int v=eg[u][i];
            if(v==f[u]) continue;
            if(!dfn[v])
            {
                child++;
                f[v]=u;
                dfs(v);
                low[u]=min(low[u],low[v]);
                if(!add&&((!f[u]&&child>1)||(f[u]&&low[v]>=dfn[u])))
                {
                    point.push_back(u);
                    add=1;
                }
                if(low[v]>dfn[u]) edge.push_back(make_pair(min(u,v),max(u,v)));
            }
            else low[u]=min(low[u],dfn[v]);
        }
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        int n,m,u,v;
        scanf("%d%d",&n,&m);
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&u,&v);
            eg[u].push_back(v);
            eg[v].push_back(u);
        }
        dfs(1);
        if(!point.size()) printf("Null
    ");
        else
        {
            sort(point.begin(),point.end());
            printf("%d",point[0]);
            for(int i=1;i<point.size();i++)
                printf(" %d",point[i]);
            printf("
    ");
        }
        sort(edge.begin(),edge.end());
        for(int i=0;i<edge.size();i++)
            printf("%d %d
    ",edge[i].first,edge[i].second);
        return 0;
    }
  • 相关阅读:
    [转]Linux中用编译的Zlib库替换系统自带的
    [转]Leptonica在VS2010中的编译及简单使用举例
    我的tesseract学习记录
    [转]在VS2010下编译和使用tesseract_ocr
    [转]图像resize
    JVM基础知识(摘抄整理)
    JVM运行时数据内存区和指令集(摘抄整理)
    JMM For Object Size(摘抄整理)
    JMM课程小结(摘抄整理)
    Class的加载过程
  • 原文地址:https://www.cnblogs.com/d-e-v-i-l/p/5572296.html
Copyright © 2011-2022 走看看