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这样一个简单得图一 ...
随机推荐
- 关于ip包长度
http://blog.csdn.net/naturebe/article/details/6712153 这篇文章总结的不错,转自:http://hi.baidu.com/to_wait/blog/ ...
- 【解决办法--实测可行】Partition 1 does not start on physical sector boundary.
新的硬盘使用fdisk进行划分的时候有提示Partition 1 does not start on physical sector boundary.后面按网上找的办法,在fdisk进行分区的时候, ...
- 201621123008 《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计. 分 ...
- eclipse中tomcat调试正确关联源码
1.build path中jar包关联本地源码 2.tomcat中添加source关联工程lib下的jar包 以上两步即可. 可解决tomcat直接关联本地源码debug时无法计算表达式的情况. 错误 ...
- 最全面!2019年最新UX设计趋势预测合集
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 追逐潮流是每个行业都必做的一件事,对于直接影响数字产品定位和用户感知方式的UX设计也是如此. 不论你 ...
- JDK8集合类源码解析 - LinkedList
linkedList主要要注意以下几点: 1构造器 2 添加add(E e) 3 获取get(int index) 4 删除 remove(E e),remove(int index) 5 判断对象 ...
- Flex 确定弹出窗口的绝对位置x , y
var selectbox:Selectbox; selectbox = new SelectBox(); var pt:Point = new Point(0,0); pt = this.paren ...
- 【Java】生成图形验证码
本章介绍一个能生成比较好看的图形验证码类 生成验证码工具类 package com.util; import java.awt.Color; import java.awt.Font; import ...
- word表格如何实现序号自动填充
打开word文档,我们需要在如下表格中的准考证号这一列中输入准考证号,手工输入肯定很慢,且容易出错. 我们先选中需要填充准考证号的表格. 选择功能区域中的“开始”,在“段落”组中点击“编号”按 ...
- ARM cortexM4中断优先级的一点理解。
根据手册PM0214 40页.213页.200.195.interrupt priority grouping. 根据手册EM0090 第371页. stm32f42xxx除掉fpu部分,有91个可屏 ...