Warm up
hdu4612:http://acm.hdu.edu.cn/showproblem.php?pid=4612
题意:给你一个无向连通图,问加上一条边后得到的图的最少的割边数;
题解:首先对原图求割边数,然后缩点之后建树,然后求树的直径。因为加上一条边,能消耗最大的割边就是树的直径。一道很好的模板题目。
- #pragma comment(linker,"/STACK:100000000,100000000")//阔栈的语句
- #include <stdio.h>
- #include <string.h>
- #include <vector>
- #define pb push_back
- using namespace std;
- const int maxn = ;
- const int maxm = ;
- struct EDGE{
- int next, to, vis;
- }edge[maxm*];//记录边,vis表示这一条边是否被访问
- struct GEEDGE {
- int u, to;
- }geedge[maxm];//记录割边
- int n,m,time,top,type,getot,cnt;//time是时间戳,type标记连通块,getot割边的数量,cnt边数
- int head[maxn],st[maxn],dfn[maxn],low[maxn],belo[maxn];//belo[i],表示i属于哪个连通块
- int start,ans1,ans,u,v;
- void init(){
- time=top=type=getot=cnt=;
- memset(head,-,sizeof(head));
- memset(dfn,,sizeof(dfn));
- memset(low,,sizeof(low));
- memset(belo,,sizeof(belo));
- }
- void add(int u,int v){
- edge[cnt].to=v;
- edge[cnt].next=head[u];
- edge[cnt].vis=;
- head[u]=cnt++;
- }
- void dfs(int u) {
- low[u] = dfn[u] = ++time;
- st[++top] = u;
- for(int i = head[u];i != -;i = edge[i].next) {
- if(edge[i].vis) continue;
- edge[i].vis = edge[i^].vis = ;
- int to = edge[i].to;
- if(!dfn[to]) {
- dfs(to);
- low[u] = min(low[u], low[to]);
- if(low[to] > dfn[u]) {//表示找到一个连通块
- type++;
- int v;
- do {
- v = st[top--];
- belo[v] = type;//表示v属于第type个连通块
- } while(v != to);
- geedge[++getot].u = u;//记录割边的起点
- geedge[getot].to = to;//记录割边的另一个点
- }
- }
- else
- low[u] = min(low[u], low[to]);
- }
- }
- void DFS(int len,int fa,int now){//求树的直径
- if(len>ans){
- ans=len;
- start=now;
- }
- for(int i=head[now];i!=-;i=edge[i].next){
- int v=edge[i].to;
- if(v!=fa) DFS(len+,now,v);
- }
- }
- int main(){
- while(~scanf("%d%d",&n,&m)&&n){
- init();
- for(int i=;i<=m;i++){
- scanf("%d%d",&u,&v);
- add(u,v);
- add(v,u);
- }
- for(int i=;i<=n;i++)
- if(!dfn[i])
- dfs(i);
- ans1=getot;
- memset(head,-,sizeof(head));cnt=;//刷新边,接下来从新加边
- for(int i=;i<=ans1;i++){
- add(belo[geedge[i].to],belo[geedge[i].u]);
- add(belo[geedge[i].u],belo[geedge[i].to]);
- }
- ans = ;
- DFS(,-,);//
- ans=;
- DFS(,-,start);//两遍DFS求树的直径
- printf("%d\n", getot-ans);
- }
- }
Warm up的更多相关文章
- f4: Facebook’s Warm BLOB Storage System——Erasure Code
Facebook在OSDI 2014上发表论文f4: Facebook's Warm BLOB Storage System,这个系统主要目的就是降低存储成本,在容忍磁盘,主机,机架,数据中心的同时提 ...
- hdu 4612 Warm up 双连通+树形dp思想
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total S ...
- HDU 4612 Warm up tarjan缩环+求最长链
Warm up Problem Description N planets are connected by M bidirectional channels that allow instant ...
- HDU 4612 Warm up(2013多校2 1002 双连通分量)
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Su ...
- HDU 4619 Warm up 2(2013多校2 1009 二分匹配)
Warm up 2 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total S ...
- hdu 4619 Warm up 2(并查集)
借用题解上的话,就是乱搞题.. 题意理解错了,其实是坐标系画错了,人家个坐标系,我给当矩阵画,真好反了.对于题目描述和数据不符的问题,果断相信数据了(这是有前车之鉴的hdu 4612 Warm up, ...
- hdoj 4612 Warm up【双连通分量求桥&&缩点建新图求树的直径】
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Su ...
- 2013多校联合2 I Warm up 2(hdu 4619)
Warm up 2 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total ...
- HDU 多校联合练习赛2 Warm up 2 二分图匹配
Warm up 2 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total ...
- 多校联赛2 Problem2 Warm up 求桥的数目+缩点后的树的直径 当时被不知道原因的爆栈爆到无语了。。
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total S ...
随机推荐
- oracle3
查看表结构 DESC emp; 查询所有列 SELECT * FROM dept; 切忌动不动就用select * set timing on; 打开显示操作时间的开关,在下面显示查询时间. CREA ...
- careercup-数组和字符串1.7
1.7 编写一个算法,若M*N矩阵中某个元素为0,则将其所在的行与列清零. 类似于leetcode中的 Set Matrix Zeroes C++实现代码: #include<iostream& ...
- Myapplication的作用与理解
1.前沿在设置里面,对应于某一个应用,虽然没有启动,但是上面有一个终止按钮,说明这个应用时启动的,只是里面没有Activity,所以说使用android退出把一个应用退出,实际上他所对应的Applic ...
- j2ee学习笔记 Filter过滤器
作用:过滤response和request对象的内容 使用: Filter是J2EE的一个接口,自定义Filter需要实现该接口,并重写所有的方法. Filter提供的方法: init() doFil ...
- java Thread.join()
thread1.join()方法阻塞调用此方法的线程,直到线程thread1完成,此线程再继续. 通常用于在main()主线程内,等待其它线程完成再结束main()主线程 @Test /** * ou ...
- Mysql Join语法解析与性能分析详解
一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1 ...
- DataGridView编辑实时生效和索引-1没有值问题
1. 问题:DataGridView单元格编辑后,只有离开焦点时,编辑的内容才会生效(在绑定的DataSource中生效). 使用 this.dataGridView1.CommitEdit(Dat ...
- ITPub 上的一道题,学习下思路
有意思的,从别处看来的即可为己用--拿来主义 数据库:MS SQL 2000: drop table mytest go create table mytest ( sn int, ...
- struts -执行流程
When a client request is given, a web container will receive request Web container loads web.xml and ...
- UITabBar-UITabBarItem图片的背景颜色属性和文字的颜色大小设置
UITabBarItem设置的图片选中状态下默认的是蓝色,如何改变它的颜色为图片自带的颜色呢? typedef NS_ENUM(NSInteger, UIImageRenderingMode) { / ...