poj Transferring Sylla(如何快速的判断一个图是否是3—连通图,求割点,割边)
来源:互联网 发布:密码软件 编辑:程序博客网 时间:2024/06/05 09:21
Transferring Sylla
首先,什么是k连通图?k连通图就是指至少去掉k个点使之不连通的图。
题目:
题目描述的很裸,就是给你一张图要求你判断这图是否是3-连通图。
算法分析:
/////////////////////////////////////////////////////////////////////
(网上别人的分析,分析的很好所以直接引用了)
/////////////////////////////////////////////////////////////////////////
但是这肯定超时!
所以,我们还要优化。我们可以想到既然枚举两个点会超时,那么现在我只枚举一个点呢?当然是可以的。
但是,为什么可以只枚举一个点呢?因为,我们从割点的定义可以知道当一个图是强连通图时候,那么他一定没有割点。所以,当我们枚举到了删除点的时候,那么在剩下的图中如果存在割点那个这个图一定不是3-连通图。因为,此时我们只要删除两条边就可以使其不连通了。
给出求解割点割边的模板,这题只要一套模板就可以了。
///////////// DATA /////////////////////vector<int> G[MAXN];int V,E;bool cut[MAXN]; // 是否是割点int color[MAXN]; //0:没有访问 1:正在访问 2:已经访问int lowc[MAXN]; //表示i及i的子孙相连的辈分最高的祖先节点所在的深度int d[MAXN]; //表示i节点在树中的深度int root; //根节点int fath; //父节点int pcnt; //割点个数int egcnt; //割边个数bool flag; //是否存在割点///////////// DATE END //////////////////////////初始化void init(){ flag = false; for(int i = 0;i <= V;++i) G[i].clear();}///////////////// Tarjan //////////////////////void dfs(int u,int fa,int deep){ color[u] = 1; //正在访问 lowc[u] = d[u] = deep; // 深度 int tot = 0; //子树个数 int i,v; for(i = 0;i < (int)G[u].size();++i){ v = G[u][i]; if(v != fa&&color[v] == 1){ lowc[u] = min(lowc[u],d[v]); } if(0 == color[v]){ dfs(v,u,deep + 1); tot++; //子树 +1 lowc[u] = min(lowc[u],lowc[v]); //求割点 if((u == root&&tot > 1)||(u != root&&lowc[v] >= d[u])){ cut[u] = 1; //不能将pcnt++写到这里 flag = true; } /* //求割边 u - > v是割边 if(lowc[v] > d[u]){ edge[u][v] = true; } */ } } color[u] = 2;}//////////// END Tarjan ///////////////void calc(int del){ pcnt = egcnt = 0; memset(cut,0,sizeof(cut)); memset(color,0,sizeof(color)); memset(lowc,0,sizeof(lowc)); memset(d,0,sizeof(d)); color[del] = 2; root = 0; if(del == 0) root = 1; dfs(root,-1,1); /* //统计割点个数 for(int i = 0;i < V;++i) if(cut[i]) pcnt++; */}//求图是否是三连通void solve(){ for(int i = 0;i < V;++i){ calc(i); //判断图是否连通 for(int j = 0;j < V;++j){ if(0 == color[j]){ flag = true; break; } } if(flag) break; }}
1 0
- poj Transferring Sylla(如何快速的判断一个图是否是3—连通图,求割点,割边)
- Poj 3713 Transferring Sylla 3-连通
- POJ 3713 Transferring Sylla(图的三联通,tarjan算法
- [POJ 3713] Transferring Sylla (枚举删点+Tarjan求割点)
- POJ-3713-Transferring Sylla
- Transferring Sylla POJ, 3713
- POJ,3713 Transferring Sylla
- 判断一个图是否是连通
- 判断一个图是否连通
- POJ 3713 Transferring Sylla 已翻译
- 求一个连通图的割点,割点的定义是,如果除去此节点和与其相关的边,图不再连通,描述算法
- tarjan算法入门整理专题(判断是否是一个强连通、通过缩点求至少加几条边让整个图变成强连通和传递的最小费用)
- 求一个连通图的割点
- 求一个连通图的割点(去掉一个点后图不再连通)
- poj 2762 强连通分量+拓扑排序(判断图是否为单向连通)
- POJ3713-Transferring Sylla
- POJ3713: Transferring Sylla 题解
- POJ3713-Transferring Sylla
- 好友列表
- Git(一):Git与版本控制简介 .
- Redhat linux下安装oracle11r2手册+截图_toto_V1.0
- OpenGL在 Visual Studio 2008/2010 和 VC6++ 上面的配置(学习笔记)
- Ural 1119 Metro(DP)
- poj Transferring Sylla(如何快速的判断一个图是否是3—连通图,求割点,割边)
- Java LinkedBlockingQueue和ArrayBlockingQueue分析 .
- Z80 CPU资料调查
- 【解答】关于内核中没开MMU之前的虚拟地址物理地址转换问题
- 深入讲解标准c语言的IO
- Ubuntu14.04下边安装搜狗输入法
- nyoj263精挑细选
- 总结个人实际工作中如何管控项目几个关键点
- 新人的时间管理