hdu4612 Warm up 缩点+树的直径
题意抽象后为:
给定一个无向图
问添加一条边的情况下最少能有多少个桥。
桥的定义:删除该边后原图变为多个连通块。
数据规模:点数N(2<=N<=200000),边数M(1<=M<=1000000)
缩点之后求一下树的直径就好了,最优加边方案显然为连接直径的头尾。
AC代码:
- #include<cstdio>
- #include<cstring>
- #include<queue>
- #define rep(i,a,b) for(int i=a;i<=b;++i)
- using namespace std;
- const int MAXV=;
- const int MAXE=;
- int DFN[MAXV],low[MAXV],par[MAXV],label[MAXV];
- int pointer[MAXV];
- int tot,cnt,m,n,Bcnt,ans;
- vector<int> graph[MAXV];
- int dep[MAXV];
- struct Edge
- {
- int to,next;
- bool vis;
- Edge() {}
- Edge(int b,int nxt,int flag) {to=b,next=nxt,vis=flag;}
- }edge[MAXE];
- inline void addedge(int a,int b)
- {
- edge[tot]=Edge(b,pointer[a],);
- pointer[a]=tot++;
- edge[tot]=Edge(a,pointer[b],);
- pointer[b]=tot++;
- }
- void init()
- {
- tot=;
- cnt=;Bcnt=;
- memset(pointer,-,sizeof(pointer));
- memset(label,,sizeof(label));
- memset(DFN,,sizeof(DFN));
- rep(i,,n)
- {
- graph[i].clear();
- }
- }
- void tarjan(int u)
- {
- DFN[u]=low[u]=++cnt;
- for(int j=pointer[u];j!=-;j=edge[j].next)
- {
- int v=edge[j].to;
- if(edge[j].vis) continue;
- edge[j].vis=edge[j^].vis=;
- if(!DFN[v])
- {
- par[v]=j;
- tarjan(v);
- if(low[v]<low[u]) low[u]=low[v];
- }
- else if(low[u]>DFN[v]) low[u]=DFN[v];
- }
- }
- void part(int u)
- {
- label[u]=Bcnt;
- for(int j=pointer[u];j!=-;j=edge[j].next)
- {
- int v=edge[j].to;
- if(!label[v]&&edge[j].vis) part(v);
- }
- }
- void bfs(int s)
- {
- rep(i,,Bcnt) dep[i]=-;
- queue<int > q;
- dep[s]=;
- q.push(s);
- while(!q.empty())
- {
- int u=q.front();q.pop();
- for(int j=;j<graph[u].size();++j)
- {
- int v=graph[u][j];
- if(dep[v]==-)
- {
- dep[v]=dep[u]+;
- q.push(v);
- }
- }
- }
- }
- int diameter()
- {
- bfs();
- int ma=,tag;
- rep(i,,Bcnt)
- {
- if(dep[i]>ma)
- {
- tag=i;
- ma=dep[i];
- }
- }
- bfs(tag);
- ma=;
- rep(i,,Bcnt)
- {
- if(dep[i]>ma)
- {
- tag=i;
- ma=dep[i];
- }
- }
- return ma;
- }
- int main()
- {
- //freopen("in.txt","r",stdin);
- while(scanf("%d%d",&n,&m)==&&(n+m))
- {
- init();
- int u,v;
- rep(i,,m)
- {
- scanf("%d%d",&u,&v);
- addedge(u,v);
- }
- tarjan();
- int tmp;
- rep(i,,n)
- {
- tmp=par[i]^;
- u=edge[tmp].to;
- if(low[i]>DFN[u])
- {
- edge[tmp].vis=;
- edge[tmp^].vis=;
- }
- }
- Bcnt=;
- rep(i,,n)
- {
- if(!label[i])
- {
- Bcnt++;
- part(i);
- }
- }
- rep(i,,n)
- {
- if(!edge[par[i]].vis)
- {
- tmp=par[i]^;
- u=edge[tmp].to;
- graph[label[u]].push_back(label[i]);
- graph[label[i]].push_back(label[u]);
- }
- }
- printf("%d\n",Bcnt--diameter());
- }
- return ;
- }
hdu4612 Warm up 缩点+树的直径的更多相关文章
- HDU4612:Warm up(缩点+树的直径)
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Su ...
- HDU4612 Warm up 边双(重边)缩点+树的直径
题意:一个连通无向图,问你增加一条边后,让原图桥边最少 分析:先边双缩点,因为连通,所以消环变树,每一个树边都是桥,现在让你增加一条边,让桥变少(即形成环) 所以我们选择一条树上最长的路径,连接两端, ...
- hdu 4612 Warm up 有重边缩点+树的直径
题目链接 Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Tot ...
- hdu4612(双连通缩点+树的直径)
传送门:Warm up 题意:询问如何加一条边,使得剩下的桥的数目最少,输出数目. 分析:tarjan缩点后,重新建图得到一棵树,树上所有边都为桥,那么找出树的直径两个端点连上,必定减少的桥数量最多, ...
- hdu-4612(无向图缩点+树的直径)
题意:给你n个点和m条边的无向图,问你如果多加一条边的话,那么这个图最少的桥是什么 解题思路:无向图缩点和树的直径,用并查集缩点: #include<iostream> #include& ...
- HDU 4612 Warm up (边双连通分量+缩点+树的直径)
<题目链接> 题目大意:给出一个连通图,问你在这个连通图上加一条边,使该连通图的桥的数量最小,输出最少的桥的数量. 解题分析: 首先,通过Tarjan缩点,将该图缩成一颗树,树上的每个节点 ...
- F - Warm up HDU - 4612 tarjan缩点 + 树的直径 + 对tajan的再次理解
题目链接:https://vjudge.net/contest/67418#problem/F 题目大意:给你一个图,让你加一条边,使得原图中的桥尽可能的小.(谢谢梁学长的帮忙) 我对重边,tarja ...
- codeforces GYM 100114 J. Computer Network 无相图缩点+树的直径
题目链接: http://codeforces.com/gym/100114 Description The computer network of “Plunder & Flee Inc.” ...
- 【HDU 4612 Warm up】BCC 树的直径
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4612 题意:一个包含n个节点m条边的无向连通图(无自环,可能有重边).求添加一条边后最少剩余的桥的数 ...
随机推荐
- HTTP长连接、短连接究竟是什么?
1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议. IP协议主要解决网络路由和寻址 ...
- 2的n次方用c语言怎么表示
C语言有函数,需要头文件#include <math.h>用pow(2,n)就可以了! double result = pow(2,n);
- Python-图片文字识别
百度AI接口(手写文字识别):https://ai.baidu.com/docs#/OCR-API/9ef46660 实现效果: 步骤一:接入接口 进入上述网站申请账号,然后运行相关代码,获取 acc ...
- loj2353. 「NOI2007」 货币兑换
loj2353. 「NOI2007」 货币兑换 链接 https://loj.ac/problem/2353 思路 题目不重要,重要的是最后一句话 提示 输入文件可能很大,请采用快速的读入方式. 必然 ...
- spring boot2+jpa+thymeleaf增删改查例子
参考这遍文章做了一个例子,稍微不同之处,原文是spring boot.mysql,这里改成了spring boot 2.Oracle. 一.pom.xml引入相关模块web.jpa.thymeleaf ...
- centos7安装bbr
centos7安装bbr 安装 sudo wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.s ...
- SAP Hybris电子商务最新功能
SAP Hybris电子商务最新功能 SAP Hybris 电子商务6.0中国加速器是专为中国市场设计的电子商务平台,可满足企业在全渠道销售和订单履行方面的所有需求.新版的中国加速器基于SAP H ...
- Apache web服务器(LAMP架构)
Apache web服务器(LAMP架构) apache介绍 1).世界上使用率最高的网站服务器,最高时可达70%:官方网站:apache.org 2).http 超文本协议 HTML 超文本标记语言 ...
- 几种优化方法的整理(SGD,Adagrad,Adadelta,Adam)
参考自: https://zhuanlan.zhihu.com/p/22252270 常见的优化方法有如下几种:SGD,Adagrad,Adadelta,Adam,Adamax,Nadam 1. SG ...
- SQL LITE安装
SQLite是一款轻型的嵌入式关系数据库,轻量级,效率高,操作起来也特别方便我们今天来讲解一下SQLite的安装和一些基本操作SQLite下载我是64位机,下载下面的两个解压就好添加path环境变量, ...