题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34902

思路:首先是双连通缩点,然后就是搜索一下,搜索时要跳过连通分量的点的个数>=2的点,最后的答案是n*(n-1)/2.

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stack>
  6 #include<vector>
  7 using namespace std;
  8 #define MAXN 11111
  9 #define MAXM 444444
 10
 11 struct Edge{
 12     int v,next;
 13 }edge[MAXM];
 14
 15 int n,m,NE,cnt,_count;
 16 int head[MAXN];
 17
 18 void Insert(int u,int v)
 19 {
 20     edge[NE].v=v;
 21     edge[NE].next=head[u];
 22     head[u]=NE++;
 23 }
 24
 25 int low[MAXN],dfn[MAXN];
 26 int color[MAXN];
 27 bool mark[MAXN];
 28 stack<int>S;
 29 void Tarjan(int u,int father)
 30 {
 31     int flag=0;
 32     low[u]=dfn[u]=++cnt;
 33     mark[u]=true;
 34     S.push(u);
 35     for(int i=head[u];i!=-1;i=edge[i].next){
 36         int v=edge[i].v;
 37         if(v==father&&!flag){ flag=1;continue; }
 38         if(dfn[v]==0){
 39             Tarjan(v,u);
 40             low[u]=min(low[u],low[v]);
 41         }else if(mark[v]){
 42             low[u]=min(low[u],dfn[v]);
 43         }
 44     }
 45     if(low[u]==dfn[u]){
 46         _count++;
 47         int x=S.top();
 48         if(x==u)S.pop();
 49         else {
 50             do{
 51                 x=S.top();
 52                 S.pop();
 53                 mark[x]=false;
 54                 color[x]=_count;
 55             }while(x!=u);
 56         }
 57     }
 58 }
 59
 60 int ans;
 61 void dfs(int u,int father)
 62 {
 63     color[u]=1;
 64     _count++;
 65     for(int i=head[u];i!=-1;i=edge[i].next){
 66         int v=edge[i].v;
 67         if(v==father)continue;
 68         if(color[v])continue;
 69         dfs(v,u);
 70     }
 71 }
 72
 73
 74 int main()
 75 {
 76     int _case,u,v,t=1;
 77     scanf("%d",&_case);
 78     while(_case--){
 79         scanf("%d%d",&n,&m);
 80         NE=0;
 81         memset(head,-1,sizeof(head));
 82         while(m--){
 83             scanf("%d%d",&u,&v);
 84             Insert(u,v);
 85             Insert(v,u);
 86         }
 87         cnt=_count=0;
 88         memset(dfn,0,sizeof(dfn));
 89         memset(color,0,sizeof(color));
 90         for(int i=1;i<=n;i++){
 91             if(dfn[i]==0)Tarjan(i,-1);
 92         }
 93         ans=0;
 94         for(int i=1;i<=n;i++){
 95             if(color[i]==0){
 96                 _count=0;
 97                 dfs(i,-1);
 98                 ans+=_count*(_count-1)/2;
 99             }
100         }
101         printf("Case #%d: %d\n",t++,ans);
102     }
103     return 0;
104 }
105
106
107
108         

View Code

转载于:https://www.cnblogs.com/wally/p/3320800.html

UVALive 6044(双连通分量的应用)相关推荐

  1. Uvalive 3523 - Knights of the Round Table (双连通分量+二分图)

    题目链接 https://vjudge.net/problem/UVALive-3523 [题意] 有n个骑士经常举行圆桌会议,每次圆桌会议应至少有3个人参加且人数必须是奇数,相互憎恨的骑士不能坐在圆 ...

  2. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

  3. AcWing 397. 逃不掉的路(边双连通分量缩点成树 + 树链剖分乱搞)

    整理的算法模板合集: ACM模板 我们知道在同一个边双连通分量中的点没有必经边(因为至少有两条分离的路径). 所以我们直接tarjan求出桥后缩点,然后求一下树上两点间的距离即可. 那么如何求树上两点 ...

  4. UVA1364 Knights of the Round Table(双连通分量、二分图染色,超详细解释)

    整理的算法模板合集: ACM模板 UVA1364 Knights of the Round Table 题目中要求互相有憎恨关系的人不能坐在相邻的位置,一个圆桌可以很形象地看作是一个环,也就是说我们两 ...

  5. 【图论专题】无向图的双连通分量

    A.AcWing 395. 冗余路径 结论:变成边双连通分量所需要新建的边数 无向图 连多少条边使得整个无向图变成任意两个点之间都有两条完全不相同的路径. 结论1:任意两个点之间都有两条完全不相同的路 ...

  6. UVA 610 Street Directions 双连通分量

    首先找到全部双连通分量,然后对于某一个结点数大于2的连通分量,可以把全部的边改成单向的,按DFS的顺序. 结点数为2的也就是一条为桥的边,必须保持双向. //#pragma comment(linke ...

  7. [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)

    [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...

  8. poj 3352 双连通分量

    至少加几条边成为双连通分量 #include <iostream> #include <cstdio> #include <cstring> using names ...

  9. 无向图——双连通分量

    双连通图:在无向图连通图中,如果删除该图中的任意一点和依附它的边,不改变图的连通性,则称该图为双连通的无向图. 由上述定义可知,双连通分量中,每两个结点之间至少有两条不同的路径可以相互到达. 割点:在 ...

最新文章

  1. 面试阿里,被一大总监全程质疑前公司
  2. DotnetSpider (二) Downloader的设置 Request自定义数据字典
  3. c语言支持默认参数吗,嵌入式C语言可以带“默认参数”的函数吗
  4. php strpos无效,簡單的PHP strpos功能不起作用,為什么?
  5. 23 | 二叉树基础(上):什么样的二叉树适合用数组来存储?
  6. pytorch利用rnn通过sin预测cos 利用lstm预测手写数字
  7. mysql命令实践_MySQL:常用命令行
  8. ipad能安装python么_ipad上能安装python吗
  9. 浅谈line-height
  10. window 下的mysql_Window下mysql的安装
  11. ssis 执行任务的日志_SSIS和PowerShell –执行流程任务
  12. 开课吧9.9学python课_python 自动化运维 零基础入门 课程
  13. Unlocker使用
  14. 用CDR(coreldraw)怎么把图片转为矢量图
  15. MFC C++视频播放和视频的浓缩播放和检测目标接口
  16. 零基础如何学 Web 前端开发?
  17. 谷歌浏览器突然翻译不了怎么办?
  18. C语言运算符的优先级表
  19. 控制Unity中脚本的运行顺序
  20. 集合--Set集合--HashSet类、LinkedHashSet类、TreeSet类及其自然排序

热门文章

  1. “Usage of API documented as @since 1.8+”
  2. Flink SQL Client注册JAVA UDF完整流程
  3. jshell的安装使用
  4. sql判断null/空缺值
  5. Row size too large ( 8126)(解决)
  6. hessian矩阵与鞍点关系浅析
  7. CentOS7: How to resolve curl#56 - Recv failure: Connection reset by peer
  8. go连接mysql集群_什么是MySQL集群-Go语言中文社区
  9. 解决cc1plus.exe: out of memory allocating bytes
  10. (十四)java版spring cloud+spring boot 社交电子商务平台-使用spring cloud Bus刷新配置...