hdu 4587 推断孤立点+割点+ 删除点之后,剩下多少连通分量
做了非常久......
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4587
先枚举删除的第一个点,第二个点就是找割点。没有割点当然也有答案
学到的:
1、图论硬套模板不太现实,比方这道题,我能想到孤立点是特殊情况,删除孤立点。连通分支个数会降低一,可是一直处理不好,最后按缩点的做法搞了。
推断是不是孤立点的方法:
就是先用一个数组scnt[i]=j,vv[j]++ 表示点i在以j为祖先的联通分支里,并且每次都让vv[j]++,就使得vv[j]表示以j为祖先的连通分支的点的个数为vv[j],这个但是没模版的。自己乱改搞出来的,開始试了几种其它方法都WA。。。
2、我自己的求割点的模板里,subset[i]==0的时候,就表示删除该点的时候。其连通分支数没有添加,这包括了悬挂顶点和孤立顶点。求是不是割点的时候。仅仅要subset[v]>0,那么v就是割点,可是在求删除该点之后的连通分支个数的时候,悬挂顶点和孤立顶点这两种情况是要分开的,假设subset[i]==0
&& i是悬挂顶点。连通分支数目不变。假设subset[i]==0 && i是孤立点。连通分支数目减一。所以1中推断是不是孤立点的方法还是比較重要的
3、这道题開始的时候全然没有思路。由于一直想的都是“两个点一起删除怎么让连通分支数目最多“,而没有尝试这么思考:”想删一个点,然后在删除一个点“(就是说放一块思考想不出来就一步一步想),也没有这么思考”不知道怎么做决策的时候就枚举“,由于时间12s。足够枚举。我的代码也在6000ms之内跑出来了。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std; const int MAXN =5000*2+100;
struct Node
{
int to,next,from;
int u;
}e[MAXN];
int n,m;
int head[MAXN];
int vis[MAXN],son, subset[MAXN],dfn[MAXN],low[MAXN],tmpdfn,first,vv[MAXN],scnt[MAXN];
void init()
{
memset(head,-1,sizeof(head));
for(int i=0;i<n*2+10;i++)e[i].from=-1;
} void addedge(int u,int v,int k)
{
e[k].to=v;
e[k].from=u;
e[k].next=head[u];
//e[k].u=0;
head[u]=k;
}
int rt;
void init2()
{
tmpdfn=0;
memset(subset,0,sizeof(subset));
memset(vis,0,sizeof(vis));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(vv,0,sizeof(vv));
memset(scnt,-1,sizeof(scnt));
} void dfs(int u)
{
dfn[u]=low[u]=++tmpdfn;
for(int j=head[u];j!=-1;j=e[j].next)
{
if(e[j].to!=first)//
{
int v=e[j].to;
if(!vis[v])
{
vis[v]=1;
scnt[v]=rt,vv[rt]++;
dfs(v);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u])
{
if(u == rt)son++;
else subset[u]++;
}
}
else
{
low[u]=min(low[u],dfn[v]);
}
}
}
} int solve()
{
int ans=0,cnt=0;
for(int k=0;k<n;k++)
{
//删点
first=k;
init2();
cnt=0; for(int i=0;i<n;i++)
{
if(i!=first)
{
if(!vis[i])
{
son=0;
rt=i;
cnt++;
vis[i]=1;
scnt[rt]=rt,vv[rt]++;
dfs(i);
if(son)subset[rt]=son-1;
}
}
}
int pos=-1,mmax=0;
for(int i=0;i<n;i++)
if(i != first )//ans=max(ans,subset[i]+cnt);//cnt-1+subset[i]+1
{
if(mmax<subset[i]+cnt)
{
pos=i;
mmax=subset[i]+cnt;
}
}
if(vv[scnt[pos]] == 1)mmax--;//不是割点。去掉该点后,连通分支数不会添加
ans=max(ans,mmax);
}
return ans;
} int main()
{
//freopen("hdu4587.txt","r",stdin);
int u,v,k;
while(~scanf("%d%d",&n,&m))
{
init();
for(int i=0,k=0;i<m;i++)
{
scanf("%d%d",&u,&v);
addedge(u,v,k++);
addedge(v,u,k++);
}
printf("%d\n",solve());
}
return 0;
}
hdu 4587 推断孤立点+割点+ 删除点之后,剩下多少连通分量的更多相关文章
- HDU 4587 TWO NODES 枚举+割点
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4587 TWO NODES Time Limit: 24000/12000 MS (Java/Other ...
- HDU 4587 TWO NODES(割点)(2013 ACM-ICPC南京赛区全国邀请赛)
Description Suppose that G is an undirected graph, and the value of stab is defined as follows: Amon ...
- HDU 4587 TWO NODES 割点
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4587 题意: 删除两个点,使连通块的数目最大化 题解: 枚举删除第一个点,然后对删除了第一个点的图跑 ...
- hdu 4587(割点的应用)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4587 思路:题目的意思很简单,就是删除任意2个节点以及关联的边,求图的最大连通分量数.我们知道删除割点 ...
- HDU - 4587 TWO NODES (图的割点)
Suppose that G is an undirected graph, and the value of stab is defined as follows: Among the expres ...
- hdu 4587 2013南京邀请赛B题/ / 求割点后连通分量数变形。
题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量. 思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可.算法相对简单,但是注意几个细节: 1:原图可能不连通. 2:有 ...
- HDU 4587 TWO NODES(割两个点的最大连通分支数)
http://acm.hdu.edu.cn/showproblem.php?pid=4587 题意: 给一图,求割去两个点后所能形成的最大连通分支数. 思路: 对于这种情况,第一个只能枚举,然后在删除 ...
- HDU 5687 字典树插入查找删除
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 #include< ...
- HDU 4587 B - TWO NODES tarjan
B - TWO NODESTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view ...
随机推荐
- SQL编程语句
视图 视图就是我们查询出来的虚拟表创建视图:create view 视图名 as SQL查询语句,分组,排序,in 等都不能写视图的用法: select * from 视图名 SQL编程 定义变量:d ...
- MVC的学习-EF的认识
1.什么是EF EF又称持久层框架:平时C#定义的变量是保存到内存中的,一断电就没有了.而持久的意思是数据保存到硬盘盘里(数据库的sql查询是在硬盘里进行的,所以速度很慢).EF帮我们将一个对象保存到 ...
- 一个用pyton写的监控服务端进程的软件hcm
使用udp实现,简单,方便,不用三次握手 1. 所有部署服务器进程的机器有一个代理进程hagent,用来监听hcm console中发送过来的命令 2.hcm需要提供以下命令 start :普通方式启 ...
- Python数据科学安装Numby,pandas,scipy,matpotlib等(IPython安装pandas)
Python数据科学安装Numby,pandas,scipy,matpotlib等(IPython安装pandas) 如果还没有本地安装Python.IPython.notebook等请移步 上篇Py ...
- Android 网络图片查看器与网页源码查看器
在AndroidManifest.xml里面先添加访问网络的权限: <uses-permission android:name="android.permission.INTERNET ...
- dede手机访问网站跳转到手机端模板
如何手机访问的时候跳转到自己的手机端模板,这时候需要一个js跳转代码:当手机访问的时候直接跳转到手机端 那手机端前提要有手机端的模板 <script> if(navigator.platf ...
- ElasticSearch学习笔记--一些规范,会持续更新
我们在ElasticSearch中存储的数据一般是采用json的格式存储,所以ElasticSearch中有一个叫Mapper的东西用来定义jsonschema来规范这个json 但是这个mapper ...
- ubuntu系统nginx+Redis+PHP
一.安装ngnix apt-get update sudo apt-get install nginx /etc/init.d/nginx start 二.安装php sudo apt-get ins ...
- 【sqli-labs】 less63 GET -Challenge -Blind -130 queries allowed -Variation2 (GET型 挑战 盲注 只允许130次查询 变化2)
引号闭合 http://192.168.136.128/sqli-labs-master/Less-63/?id=1' or '1'='1 剩下的和Less62一样
- 关于DOS-BOX的使用方法
将MASM文件夹里的全部文件拷贝到一个目录下,比如E:\masm下,然后将这个目录挂着为DOSBox的一个盘符下,挂载命令为 Mount c e:\masm 切换到E盘 然后编译,运行