双连通分量

题意:给一个无向图,要求毁掉两个点,使图变得不连通,图一开始是连通的

因为要毁掉两个点,就不是简单的求割点,再看看数据范围,点数为1000,边数为10000,Tarjan的时间复杂度为O(E),如果用枚举法,先枚举要毁掉的第一个点,再用Tarjan进行处理来找割点会不会超时呢?答案是不会,时间为O(v*E),刚好是千万级别,不超

做法:先枚举要删除的第1个点,在原图中删除它,看看删除它后整个图的变化

1.整个图变得不连通了(即这个点本身是割点),但是还没完要分类讨论一下

(1).整个图变为两部分,但是两部分刚好都是一个点,那么这两个点再毁掉哪个点都好,图的连通分支数都不会增加,这是一个特殊情况

      例如,(1,2)(2,3)这种图,是无解的,任意毁掉两个点都无法增加图的连通分支,所以方案数为0

(2).整个图分为两部分,但是有一部分的点数为1,另一部分大于1,那么这时候只要在较大的那部分,任意毁掉一个点(无论是不是割点都行),最后整个图都会至少被分为了两个部分

(如果毁掉的是割点,将分成更多份),所以这样产生的方案数是V-2

(3).整个图分为了两个部分,两个部分的点数都大于1,那么任意在哪个部分毁掉那个点都可以(无论是不是割点都行),最后整个图都会至少分为两个部分,所以方案数为V-1

(4).整个图被分为了三个或更多的部分,那么也是在剩下的点中任意毁掉一个点都可以(无论那个点是不是割点),方案数为V-1

(如果这个点刚好处于一个部分且这个部分只有它自己一个点,那么    毁掉后整个图的分支数减1;如果这个点在一个部分且这个部分不止它一个点且这个点不是割点,那么分支数  不会增加,如果是割点分支数为增加)

2.删除第一个点后,整个图还是连通的(是连通,不是双连通)

那么就在剩下的图中找割点,找到几个,方案数就是多少

最后注意一点,这样计算的结果,很容易想到是有重复的,但是不难想到,其实刚好重复了一次,因为对于一个图,方案是固定的,枚举了所有点,找出了所有已方案,相当于每个方案算了两次,最后答案除2即可

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 1010
#define M 10010int n,tot,cancel,rts,num;
int e[N][M];
int dfn[N],low[N],cut[N],iscut[N],cnum,dcnt;void dfs(int u ,int fa)
{dfn[u] = low[u] = ++dcnt;++num;for(int i=1; i<=e[u][0]; i++){int v = e[u][i];if(v == cancel || v == fa) continue;if(!dfn[v]){dfs(v,u);low[u] = min(low[u] , low[v]);if(fa == -1) {rts++; continue;}if(dfn[u] <= low[v]){if(!iscut[u]){ iscut[u] = 1; cut[cnum++] = u;}}} else low[u] = min(low[u] , dfn[v]);}
}void solve()
{int res = 0,count,ok;for(cancel = 1; cancel<=n; cancel++) //枚举第1个删除的点
    {count = cnum = 0;memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(iscut,0,sizeof(iscut));ok = 0;for(int i=1; i<=n; i++)if(i!=cancel && !dfn[i]){count++;num = rts = 0;dfs(i , -1);if(num == 1) { ok++; continue; }if(rts >= 2) { iscut[i] = 1; cut[cnum++] = i; }}if(count >= 3) res += (n-1);else if(count == 2 && ok == 0)   res += (n-1);else if(count == 2 && ok == 1)   res += (n-2);else if(count == 1) res += cnum;}cout << res/2 << endl;
}int main()
{int cas = 0;while(cin >> n >> tot){if(!n && !tot) break;for(int i=1; i<=n; i++)e[i][0] = 0;while(tot--){int u , v , c;cin >> u >> v;c = ++e[u][0];e[u][c] = v;c = ++e[v][0];e[v][c] = u;}printf("Case %d: ",++cas);solve();}return 0;
}

转载于:https://www.cnblogs.com/scau20110726/archive/2013/05/22/3092078.html

hdu 3671 Boonie and Clyde相关推荐

  1. HDU——1106排序(istringstream的使用、STLvector练习)

    排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  2. hdu 5438 Ponds 拓扑排序

    Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...

  3. HDU 1248 寒冰王座(全然背包:入门题)

    HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...

  4. hdu 1312 Red and Black 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 第二条深搜,题目并不难,但是做了我好久好久,由于一个细节,让我赌上了一个晚上的时间. 题目大意: ...

  5. HDU 1429 胜利大逃亡(续) (BFS+位压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  6. hdu 1272 小希的迷宫

    Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该 ...

  7. HDOJ 1157 HDU 1157 Who's in the Middle ACM 1157 IN HDU

    MiYu原创, 转帖请注明 : 转载自 ______________白白の屋   题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1157 题目描述: ...

  8. 大数加法【HDU 1002】

    大数加法模板 一般的加法只要int类型的两数直接相加即可,大一点的数可以设为long long类型,而超过长整型的数则属于大数问题了,大数加法其实也比较简单,利用数组实现就可以啦: 主要思想如下: ( ...

  9. hdu 2665(主席树查询区间k大值)

    先贴我自己写的代码做模板虽然跟原博主没什么两样.(一开始空间开的4*maxn,交到hdu上一直TLE很奇怪) #include<bits/stdc++.h> using namespace ...

最新文章

  1. VSTO Office二次开发对PPT自定义任务窗格测试
  2. laravel 框架的 csrf
  3. lua把userdata写入mysql_Lua教程(十九):userdata
  4. java中类与类的关系_Java中类与类的关系
  5. C/C++的64位整型
  6. linux添加用户命令_为Linux的cp和mv命令添加进度条
  7. termux添加php镜像,termux | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror...
  8. 程序员实用算法 源码_程序员必须知道的十大基础实用算法综述
  9. 简单两步快速实现shiro的配置和使用,包含登录验证、角色验证、权限验证以及shiro登录注销流程(基于spring的方式,使用maven构建)...
  10. 万能点位图软件_BoardViewer点位图工具
  11. 浅谈被动式IAST产品与技术实现
  12. 字母组合---排列组合问题
  13. php 覆盖写入txt文件内容,PHP使用内置函数file_put_contents覆盖写入文件及追加内容的方法...
  14. 离线安装docker
  15. Win10笔记本开启热点让手机上网
  16. 运用EXCEL RAND RANK INDEX函数制作抽奖器
  17. VS下使用LoadLibrary加载dll失败
  18. FTP服务搭建与配置
  19. JSP连接数据库进行注册登录及展示页面及下拉框查询
  20. C#:Krypton控件使用方法详解(第十四讲) ——kryptonSeparator

热门文章

  1. Java 8 获取某天最大(23:59:59)最小(00:00:00)时间
  2. 5G | 5G新基建最新进展及投资机会【包含五大板块】
  3. 450g带盖吐司配方_450g带盖吐司烤多久
  4. Debug Docker: Error response from daemon: dial unix docker.raw.sock: connect: connection refused
  5. erlang精要(7)-模块
  6. linux内核杂记(5)-进程终结
  7. python3精要(6)-string类的format()方法
  8. 【学术相关】U.S.News正式发布最新的2022最佳全球院校排名
  9. 【Python】在模仿中精进数据可视化09:近期基金涨幅排行可视化
  10. 【机器学习基础】Softmax与交叉熵的数学意义(信息论与概率论视角)