POJ3177tarjan缩点_构建双连通图
根据题意利用tarjan算法进行缩点处理后变成连通无环图,也可以说是一颗树,而且边是双向的所以,如果把这个图变成双连通,那就要对所有度为1的点进行加边处理
所以步骤如下
1·tarjan缩点处理
void tarjan(int u,int pre)
{
low[u] = dfn[u] = ++idx;
for(int v = 1;v <= n;v++)
{
if(mp[u][v])
{
if(!dfn[v])
{
tarjan(v,u);
low[u] = min(low[u],low[v]);
}
if(dfn[v] && v != pre)
{
low[u] = min(low[u],dfn[v]);
}
}
}
}
2· 计算点的度
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)//计算每个点的度
{
if(mp[i][j])
{
if(low[i] != low[j])//判断不属于一个缩点集合
{
cnt[low[j]]++;
}
}
}
}
3·计算加的边数
int ans=0; //计算度为1的点的个数
for(int i = 1;i <= n;i++)
{
if(cnt[i] == 1) ans++;
}
printf("%d\n",(ans + 1) / 2);
嗯嗯tarjan算法差不多啦
这个题目还出了一个小插曲,就是定义mp时候用的int类型,给爆了,改成bool就好了,其实就该用bool,因为只是一个01存储,但是一想bool和int差的可不是1倍两倍,而是32倍呢(还得看编译器),吓人略略略
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
const int maxn = 5010;
int n,m;
bool mp[maxn][maxn];
int low[maxn],dfn[maxn];
int idx;
int cnt[maxn];
/*
bool 类型的数据 在内存中只有一位 或0 或1
int 类型的数据 在内存中有16位或32位
*/
void init()
{
memset(low,0,sizeof(low));
memset(mp,0,sizeof(mp));
memset(dfn,0,sizeof(dfn));
memset(cnt,0,sizeof(cnt));
idx = 0;
} void tarjan(int u,int pre)
{
low[u] = dfn[u] = ++idx;
for(int v = 1;v <= n;v++)
{
if(mp[u][v])
{
if(!dfn[v])
{
tarjan(v,u);
low[u] = min(low[u],low[v]);
}
if(dfn[v] && v != pre)
{
low[u] = min(low[u],dfn[v]);
}
}
}
}
int main()
{
int u,v;
while(~scanf("%d%d",&n,&m))
{
init();
for(int i = 1;i <= m;i++)
{
scanf("%d%d",&u,&v);
mp[u][v] = mp[v][u] = 1; }
tarjan(1,1);
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)//计算每个点的度
{
if(mp[i][j])
{
if(low[i] != low[j])
{
cnt[low[j]]++;
}
}
}
}
int ans=0; //计算度为1的点的个数
for(int i = 1;i <= n;i++)
{
if(cnt[i] == 1) ans++;
}
printf("%d\n",(ans + 1) / 2);
}
return 0;
}
POJ3177tarjan缩点_构建双连通图的更多相关文章
- POJ 3177--Redundant Paths【无向图添加最少的边成为边双连通图 && tarjan求ebc && 缩点构造缩点树】
Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10798 Accepted: 4626 ...
- Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)【转】【修改】
一.基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成 ...
- (转)Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)
基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个 ...
- Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)
Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...
- POJ3352Road Construction(构造双连通图)sdut2506完美网络
构造双连通图:一个有桥的连通图,如何把它通过加边变成边双连通图? 一个有桥的连通图,如何把它通过加边变成边双连通图?方法为首先求出所有的桥,然后删除这些桥边,剩下的每个连通块都是一个双连通子图.把每个 ...
- POJ 3177——Redundant Paths——————【加边形成边双连通图】
Redundant Paths Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Sub ...
- BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量
BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路 ...
- POJ-3352 Road Construction,tarjan缩点求边双连通!
Road Construction 本来不想做这个题,下午总结的时候发现自己花了一周的时间学连通图却连什么是边双连通不清楚,于是百度了一下相关内容,原来就是一个点到另一个至少有两条不同的路. 题意:给 ...
- Redundant Paths POJ - 3177 把原图变成边—双连通图
无向图概念:(这里的x->y表示x和y之间有一条无向边)1.桥:对于一个无向图,如果删除某条边后,该图的连通分量增加,则称这条边为桥 比如1->2->3->4这样一个简单得图一 ...
随机推荐
- BOM心得
Brower Objects Model浏览器对象模型 ps: 到现在也没个正式标准.............. window是BOM的顶级对象,但一般可以省略 一.Location对象 相当于浏览器 ...
- UIButton 设置图片文字垂直居中排列
#pragma mark 按钮图片文字垂直居中排列 -(void)setButtonContentCenter:(UIButton *)button { CGSize imgViewSize,titl ...
- iOS8 UIAlertView键盘闪一下的问题
if (SYSTEM_VERSION >= 8.0) { UIAlertController *alertCtrl = [UIAlertController alertControllerWit ...
- C++动态链接库
1.动态链接库概述: 动态链接库通常都不能直接运行,也不能接受消息:只有在其他模块调用动态链接库中的函数时,它才发挥作用. Windows API中所有的函数都包含在动态链接库中. 动态链接库分静态库 ...
- js使用sessionStorage、cookie保存token
本文是参考别人的博客写的,图片直接用的别人的 1.Token:token是客户端频繁向服务器端请求数据,服务器频繁的去数据库查询用户名和密码进行对比,判断用户名和密码正确与否,并作出相应的提示,在这样 ...
- Python3实战系列之三(获取印度售后数据项目)
问题:续接上一篇.说干咱就干呀,勤勤恳恳写程序呀! 目标:实现第一个python程序的“Hello world!” 解决方案:新建一个项目Test,创建一个Test.py文件.在文件中实现打印出“He ...
- 学习selenium的过程
- Oracal 学习之用户角色创建分配表空间 给角色分配权限
//创建角色inspur 密码为inspur,默认的表空间为USERS create user inspur identified by inspur default tablespace USERS ...
- 762. Prime Number of Set Bits in Binary Representation
static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...
- 2018.11.24 poj3693Maximum repetition substring(后缀数组)
传送门 后缀数组好题. 考虑枚举循环节长度lenlenlen. 然后考虑枚举循环节的起点来更新答案. 但是直接枚举每次O(n)O(n)O(n). 考虑枚举len∗k+1len*k+1len∗k+1作为 ...