hihocoder #1184 : 连通性二·边的双连通分量

来源:互联网 发布:debian和centos哪个好 编辑:程序博客网 时间:2024/05/18 00:11
时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

在基本的网络搭建完成后,学校为了方便管理还需要对所有的服务器进行编组,网络所的老师找到了小Hi和小Ho,希望他俩帮忙。

老师告诉小Hi和小Ho:根据现在网络的情况,我们要将服务器进行分组,对于同一个组的服务器,应当满足:当组内任意一个连接断开之后,不会影响组内服务器的连通性。在满足以上条件下,每个组内的服务器数量越多越好。

比如下面这个例子,一共有6个服务器和7条连接:

其中包含2个组,分别为{1,2,3},{4,5,6}。对{1,2,3}而言,当1-2断开后,仍然有1-3-2可以连接1和2;当2-3断开后,仍然有2-1-3可以连接2和3;当1-3断开后,仍然有1-2-3可以连接1和3。{4,5,6}这组也是一样。

老师把整个网络的情况告诉了小Hi和小Ho,小Hi和小Ho要计算出每一台服务器的分组信息。

   

提示:边的双连通分量

 

输入

第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行:1个整数,表示该网络的服务器组数。

第2行:N个整数,第i个数表示第i个服务器所属组内,编号最小的服务器的编号。比如分为{1,2,3},{4,5,6},则输出{1,1,1,4,4,4};若分为{1,4,5},{2,3,6}则输出{1,2,2,1,1,2}

样例输入
6 71 21 32 33 44 54 65 6
样例输出
21 1 1 4 4 4
          答案第1行:双连通分量的个数就=桥的个数+1
          答案第2行:见代码。
#include <iostream>#include<string.h>#include<vector>#include<algorithm>using namespace std;#define maxn 20005int low[maxn],dfn[maxn],vis[maxn],Belong[maxn];int stackn[maxn],n,m,scnt,top,fa[maxn],t,ans;vector<int>mat[maxn];void dfs(int v){  int w,cnt=0, f,i;  scnt++;  vis[v]=1;  dfn[v]=low[v]=scnt;  stackn[++top]=v;  for(i=0;i<mat[v].size();i++)  {     w=mat[v][i];     if(!vis[w])     {         cnt++;         fa[w]=v;         dfs(w);         low[v]=min(low[v],low[w]);          if(low[w]>dfn[v])             ans++;     }     else if(fa[v]!=w)        low[v]=min(low[v],dfn[w]);  }     int j,a[maxn],t,t1;     if(low[v]==dfn[v])     {             // 因为low[u] == dfn[u],对(parent[u],u)来说有dfn[u] > dfn[ parent[u] ],因此low[u] > dfn[ parent[u] ]        // 所以(parent[u],u)一定是一个桥,那么此时栈内在u之前入栈的点和u被该桥分割开        // 则u和之后入栈的节点属于同一个组        //将从u到栈顶所有的元素标记为一个组,并弹出这些元素。         j=0;t=maxn;t1=top;         do         {             f=stackn[top--];              t=min(f,t);         }while(v!=f);        for(int i1=top+1;i1<=t1;i1++)           Belong[stackn[i1]]=t;     }}int main(){    int a,b,i;    cin>>n>>m;    for(i=0;i<m;i++)    {        cin>>a>>b;        mat[a].push_back(b);        mat[b].push_back(a);    }    t=scnt=top=0;    memset(vis,0,sizeof(vis));    memset(low,0,sizeof(low));    memset(dfn,0,sizeof(dfn));    memset(Belong,0,sizeof(Belong));          ans=1;          dfs(1);     cout<<ans<<endl;    for(i=1;i<n;i++)        cout<<Belong[i]<<" ";        cout<<Belong[i]<<endl;    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝买家有违规怎么办 支付宝不好实名怎么办 qq注册不了怎么办啊 关联qq要验证怎么办 忘记出厂设置密码怎么办 卖高仿被买家投诉退款怎么办 被骗了一部手机怎么办 买车被骗了怎么办 作废发票给客人怎么办 如果客人要发票怎么办 劳务公司买社保怎么办 社保征收科人员怎么办 理财公司法人跑路怎么办 杭州辞职了医保怎么办 外包工没有合同怎么办 劳务关系欠工资怎么办 劳务公司发工资怎么办 甲方不履行合同怎么办 跟私人打工受伤怎么办 单位把我们外包怎么办 给老板打工受伤怎么办 换劳务公司工龄怎么办 被用工单位开除怎么办 被公司辞退了怎么办 被公司辞退应该怎么办 劳务公司交社保怎么办 社保托管两个月没交怎么办 劳务不发工资怎么办 离开北京了医保怎么办 农保停缴交的钱怎么办 15号入职的社保怎么办 试用期辞职后社保怎么办 换公司交社保怎么办 公司未缴纳社保怎么办 社保公司转个人怎么办 公司不缴纳社保怎么办 淘宝图片太大了怎么办 社保没有买医保怎么办 电脑运行越来越慢怎么办 笔记本电脑运行越来越慢怎么办 ipad运行越来越慢怎么办