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缩点_构建双连通图的更多相关文章

  1. POJ 3177--Redundant Paths【无向图添加最少的边成为边双连通图 &amp;&amp; tarjan求ebc &amp;&amp; 缩点构造缩点树】

    Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10798   Accepted: 4626 ...

  2. Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)【转】【修改】

    一.基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成 ...

  3. (转)Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)

    基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个 ...

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

    Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...

  5. POJ3352Road Construction(构造双连通图)sdut2506完美网络

    构造双连通图:一个有桥的连通图,如何把它通过加边变成边双连通图? 一个有桥的连通图,如何把它通过加边变成边双连通图?方法为首先求出所有的桥,然后删除这些桥边,剩下的每个连通块都是一个双连通子图.把每个 ...

  6. POJ 3177——Redundant Paths——————【加边形成边双连通图】

    Redundant Paths Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...

  7. BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量

    BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路 ...

  8. POJ-3352 Road Construction,tarjan缩点求边双连通!

    Road Construction 本来不想做这个题,下午总结的时候发现自己花了一周的时间学连通图却连什么是边双连通不清楚,于是百度了一下相关内容,原来就是一个点到另一个至少有两条不同的路. 题意:给 ...

  9. Redundant Paths POJ - 3177 把原图变成边—双连通图

    无向图概念:(这里的x->y表示x和y之间有一条无向边)1.桥:对于一个无向图,如果删除某条边后,该图的连通分量增加,则称这条边为桥 比如1->2->3->4这样一个简单得图一 ...

随机推荐

  1. PAT 1067 试密码(20)(代码)

    1067 试密码(20 分) 当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度 ...

  2. jQuery的节点选择

    jQuery.parent(expr) 找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$("span").parent(&q ...

  3. Lftp 简单使用步骤

    有一用户需要在Linux上面将数据备份至存储上面,但是不支持挂载. 只可以FTP. 找了下,Lftp 这款FTP Client 满足用户的需求. 相关资料参考:http://blog.chinauni ...

  4. phpstudy报告80端口被占用

    将所有的80端口修改为81后重启,还是不行

  5. windows driver

    C:\Windows\System32\DriverStore\FileRepository

  6. JDesktopPane JInternalFrames

    通常 JInternalFrames 需要配合 JDesktopPane 一起使用. JInternalFrames 必须在 JDesktopPane 里面

  7. idea单元测试左侧装订线中的颜色指示器设置

    又是idea,idea确实很智能,由于我下载的idea设置可能初始化了,所以我找不到单元测试率覆盖的具体代码情况,到底哪些代码覆盖,哪些代码未覆盖:

  8. Vim on Mac Terminal

    2018-04-15 在Python 里面加标注, 发现Vim强大的两种用法, 比如要在1-5行加标注: 1. 用寻找和替代(basic search and replace),:1, 5s/^/# ...

  9. js实现多标签页效果

    点击导航按钮切换div的内容 html代码: <div class="tabs"> <ul id="tab"> <li>&l ...

  10. 使用EventLog Analyzer监控、管理及分析日志