HDU 4587 —— TWO NODES(枚举+割顶)
来源:互联网 发布:k近邻算法计算 编辑:程序博客网 时间:2024/05/21 20:40
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4587
题意很简单,给定一个N个点的无向图,在其中找到一对结点,将其删除使得剩下的结点构成的连通块最多,输出最多的连通块。
一开始往同时枚举两个结点的方向想,找割顶呀,桥呀,可是连样例都破不了。
后来发现如果只是删除一个点问题就好办多了,考虑删除某个点,要产生更多连通块,这个点肯定是割顶,接下来的看看删了这个点能多的连通块数量。我的做法是统计和这个点相连的边以及桥的数目,如果两者相等,那么连通块数增加桥的数目减一,否则增加桥的数目。
所以最终做法就是,枚举删除第一个点,跑一下tarjan,这里可以先把第一个点标记掉,后面跑的时候不要访问就行。然后再枚举这个情况下的割顶,取最大值即可。
#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;#define N 5000#define pb push_backstruct Edge{ int id, to;};vector<Edge> V[N];int con[N], low[N], pre[N], bridge[N], dfs_clock, ans, cnt;bool vis[N], ban[N], cut[N];void dfs(int x, int fa){ low[x] = pre[x] = ++dfs_clock; int child=0; for(int i=0; i<V[x].size(); i++){ Edge e = V[x][i]; int j = e.to; if(vis[e.id] || ban[j]) continue; vis[e.id]=1; con[x]++; con[j]++; if(!pre[j]){ child++; dfs(j, x); if(low[j]>pre[x]){ bridge[x]++; bridge[j]++; } low[x] = min(low[x], low[j]); if(low[j]>=pre[x]){ cut[x] = 1; } } else{ low[x] = min(low[x], pre[j]); } } if(fa<0 && child==1) cut[x]=0;}int main(){ int n, m, x, y; while(~scanf("%d %d", &n, &m)){ for(int i=0; i<n; i++) V[i].clear(); while(m--){ scanf("%d %d", &x, &y); V[x].pb((Edge){m,y}); V[y].pb((Edge){m,x}); } ans = 0; memset(ban,0,sizeof(ban)); for(int i=0; i<n; i++){ ban[i]=1; memset(con,0,sizeof(con)); memset(vis,0,sizeof(vis)); memset(pre,0,sizeof(pre)); memset(bridge,0,sizeof(bridge)); cnt = 0; dfs_clock=0; for(int j=0; j<n; j++){ if(!pre[j] && !ban[j]){ cnt++; dfs(j, -1); } } for(int j=i+1; j<n; j++){ if(cut[j]) ans = max(ans, cnt+ (con[j]==bridge[j]?bridge[j]-1:bridge[j])); } ban[i]=0; } printf("%d\n", ans); } return 0;}
0 0
- HDU 4587 —— TWO NODES(枚举+割顶)
- hdu 4587 TWO NODES (枚举+割点,5级)
- HDU 4587TWO NODES(割点,连通块,枚举)
- HDU 4587TWO NODES(割点,连通块,枚举)
- Hdu 4587 TWO NODES(割点)
- HDU-4587 TWO NODES (割点[Tarjan])
- [HDU 4587] TWO NODES (Tarjan+割点)
- hdu 4587 TWO NODES (割点的应用)
- 【割点】 HDU 4587 TWO NODES
- HDOJ 题目4587 TWO NODES(双联通,割点,枚举)
- HDU 4587 TWO NODES 无向图的割点
- HDU 4587 TWO NODES(割点 模板题)
- hdu 4587 TWO NODES
- hdu 4587 TWO NODES
- HDOJ 4587 TWO NODES【割点】
- HDU-4587 TWO NODES(割点变形或者求点双连通分量)
- hdu 4587 TWO NODES 关节点
- hdu 4587 TWO NODES(强连通分量)
- “破网”利器一箩筐——移动互联网分析工具推荐
- 没伞的雨天,我只能不断奔跑
- float型浮点数与double的区别
- 彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则
- Django中url的逆向解析 -> Reverse resolution of URLs
- HDU 4587 —— TWO NODES(枚举+割顶)
- 机动车驾驶培训教学与考试大纲
- 米论坛 miluntan 微信公共账号 可以关注哦。谢谢大家!
- 动态规划—最长子序列问题
- qsort函数、sort函数 (精心整理篇)
- 黑马程序员(一)-------MAC OS X的初步认识
- 机器学习--K-means算法
- jplayer播放器完整标准的写法应该是这样的
- android 加载图片防止oom的处理